首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用tidyverse查找多变量数据框中的第一个非零年

使用tidyverse查找多变量数据框中的第一个非零年
EN

Stack Overflow用户
提问于 2018-12-11 06:43:20
回答 2查看 93关注 0票数 4

我有以下数据:

代码语言:javascript
复制
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)都是非零的。

我知道如何找到第一个非零行的行号:

代码语言:javascript
复制
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

但是,我不确定如何将行号与year变量相匹配,以便准确地知道var1var2何时变为非零,而不仅仅是行号。

这就是我想要的:

代码语言:javascript
复制
     id  var1  var2
1     1   0     2001
2     2   2002  2003
3     3   2001  2001
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-11 06:50:31

我们可以做以下几件事:

代码语言:javascript
复制
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对应的函数更简洁。

票数 5
EN

Stack Overflow用户

发布于 2018-12-11 07:32:16

一种稍有不同的方法,首先将所有内容收集到一个大而长的文件中:

代码语言:javascript
复制
test %>%
  gather(var, value, var1:var2) %>%
  filter(value != 0) %>%
  group_by(id, var) %>%
  summarise(Year = min(Year)) %>%
  spread(var, Year)

## A tibble: 3 x 3
## Groups:   id [3]
#     id  var1  var2
#* <dbl> <dbl> <dbl>
#1  1.00    NA  2001
#2  2.00  2002  2003
#3  3.00  2001  2001

还有一个有趣的基础R版本:

代码语言:javascript
复制
tmp <- cbind(test[c("id", "Year")], stack(test[c("var1","var2")]))
tmp <- tmp[tmp$values != 0,]
tmp <- aggregate(Year ~ id + ind, data=tmp, FUN=min)
reshape(tmp[c("id","ind","Year")], idvar="id", timevar="ind", direction="wide")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53714810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档