检查一系列列中的值是否在其他一系列列中的值的一定数量范围内

时间:2019-07-09 17:10:15

标签: r dplyr apply

我在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中的所有值进行比较,而不仅仅是特定的列。

1 个答案:

答案 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