R:基于同一列的多个条件的子集化

时间:2014-08-19 18:31:42

标签: r

我正在尝试过滤如下所示的数据框:

KeyID   SQ Value.S  Course  Type    Survey.Num      
10001   A1  1      1024    Classic    1     
10002   A1  1      1024    Classic    1     
10002   A1  1      1024    Classic    2     
10002   A1  1      1024    Classic    3     
10005   A1  1      1024    Classic    1     
10005   A1  1      1024    Classic    2     

我想只有KeyID在Survey.Num中的值为1,2和3的行。

所以我的输出看起来像这样:

KeyID   SQ  Value.S Course  Type    Survey.Num  

10002   A1    1    1024    Classic  1    
10002   A1    1    1024    Classic  2
10002   A1    1    1024    Classic  3    

我尝试使用filter()函数,但似乎不起作用。

有什么想法?

2 个答案:

答案 0 :(得分:2)

data.table解决方案

library(data.table)
setDT(df)[, .SD[all(seq_len(3) %in% Survey.Num)], by = KeyID]

##    KeyID SQ Value.S Course    Type Survey.Num
## 1: 10002 A1       1   1024 Classic          1
## 2: 10002 A1       1   1024 Classic          2
## 3: 10002 A1       1   1024 Classic          3

答案 1 :(得分:1)

一种选择是使用ave(假设您的data.frame被称为df):

df[as.logical(ave(df$Survey.Num, df$KeyID, FUN = function(x) all(1:3 %in% x))),]
#  KeyID SQ Value.S Course    Type Survey.Num
#2 10002 A1       1   1024 Classic          1
#3 10002 A1       1   1024 Classic          2
#4 10002 A1       1   1024 Classic          3

或使用dplyr

df %>% group_by(KeyID) %>% filter(all(1:3 %in% Survey.Num))
#Source: local data frame [3 x 6]
#Groups: KeyID
#
#  KeyID SQ Value.S Course    Type Survey.Num
#1 10002 A1       1   1024 Classic          1
#2 10002 A1       1   1024 Classic          2
#3 10002 A1       1   1024 Classic          3