我在R中有一个数据帧,如下所示:
|---------------------------------------------------------|
| col1 | col2 | col3 | col4 | col5 | col6 | col7 |
|______|________|_______|_______|_______|________|________|
| x | 2003 | 2004 | 2009 | 2002 | 2011 | NA |
|------|--------|-------|-------|-------|--------|--------|
| y | 2004 | NA | NA | 2002 | 2004 | NA |
|------|--------|-------|-------|-------|--------|--------|
| x | 2007 | 2009 | NA | 2010 | 2012 | 2013 |
|---------------------------------------------------------|
我想检查col1中每个类别多少次,col5:col7中的值在(0-2)col2:col4中的任何值之后的2年或更短时间内出现。
因此所需的结果将类似于:
[[x]]
2
[[y]]
1
或作为这样的数据框:
col1 | count |
______________
x | 2
--------------
y | 1
我认为必须有一种Dplyr的方式来做到这一点?
喜欢带有gather()
和filter()
的东西吗?
或使用sapply
来获取值之间的差,然后仅计算数字> 2的某种方法?
我遇到的主要问题是,不是所有列的每一行都有值时的语法,我想将col2:col4中的值与col5:col7中的所有值进行比较,而不仅仅是特定的列。
答案 0 :(得分:0)
好的,谢谢@NelsonGon可以,但是我认为可能有一个更简单的方法:
#convert to long format
test <- mydf %>%
gather( first_group, year.1, col2:col4) %>%
gather(scond_group, year.2, col5:col7)
#remove the NA values
test <- test[-c(which(is.na(test$year.2))),]
test <- test[-c(which(is.na(test$year.1))),]
#count number fitting criteria
test2 <- test %>%
group_by(col1) %>%
filter(year.2 >= year.1 & year.2 <= year.1 + 2) %>%
summarise(n = n())
##result
#test1
## A tibble: 2 x 2
#depend_var n
#<chr> <int>
#1 x 2
#2 y 1