gpt4 book ai didi

r - 使用 tidyverse 在多个变量的数据框中查找第一个非零年份

转载 作者:行者123 更新时间:2023-12-04 12:02:56 24 4
gpt4 key购买 nike

我有以下数据:

library(tidyverse)
set.seed(1)
test <- data.frame(id = c(rep(1, 3), rep(2, 4), rep(3, 5)),
Year = 2000 + c(1,3,5,2,3,5,6,1,2,3,4,5),
var1 = sample(0:2, replace = TRUE, size = 12, prob = c(0.6, 0.3, 0.1)),
var2 = sample(0:2, replace = TRUE, size = 12, prob = c(0.6, 0.3, 0.1)))

我需要在每个 id 组中每个变量( var1var2 )不为零的第一年。

我知道如何找到第一个非零行的行号:
temp <- function(a) ifelse(length(head(which(a>0),1))==0,0,head(which(a>0),1))

test2 <- test %>% group_by(id) %>%
mutate_at(vars(var1:var2),funs(temp)) %>%
filter(row_number()==1) %>% select (-year)

id var1 var2
1 1 0 1
2 2 1 2
3 3 1 1

但是,我不确定如何将行号与年份变量匹配,以便我确切地知道 var1 是什么时候发生的。和 var2变成非零,而不是只有行号。

这就是我要的:
     id  var1  var2
1 1 0 2001
2 2 2002 2003
3 3 2001 2001

最佳答案

我们可能会做以下事情:

test %>% group_by(id) %>% summarise_at(vars(var1:var2), funs(Year[. > 0][1]))
# A tibble: 3 x 3
# id var1 var2
# <dbl> <dbl> <dbl>
# 1 1 NA 2001
# 2 2 2002 2003
# 3 3 2001 2001

即, . > 0给出一个带有 TRUE 的逻辑向量每当一个值为正时,我们选择所有相应的年份,最后只选择第一个。

这与您的方法非常相似。请注意,由于使用 summarise我不再需要 filter(row_number()==1) %>% select (-year) .另外,我的函数对应于 temp更简洁。

关于r - 使用 tidyverse 在多个变量的数据框中查找第一个非零年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53714810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com