我正在尝试过滤如下所示的数据框:
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()函数,但似乎不起作用。
有什么想法?
答案 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