我正在使用的数据表就像
require(data.table)
set.seed(2)
dt <- data.table(user=c(rep('a', 3), rep('b', 2), rep('c', 4)),
type=c(sample(LETTERS[1:4], 3),
sample(LETTERS[1:4], 2),
sample(LETTERS[1:4], 4))
)
这是
user type
1: a A
2: a C
3: a B
4: b A
5: b C
6: c D
7: c A
8: c B
9: c C
我想找到的类型中的特定用户或者A
,B
或C
只。在上面的示例中,用户c
不合格,因为他拥有D
自己的类型记录之一。所以期望的输出应该是
user type
1: a A
2: a C
3: a B
4: b A
5: b C
我想到的第一种方法效率很低,它被分割dt
为split(dt, dt$user)
并检查grepl
和nrow
是否相同,然后是索引和rbindlist
。由于我实际使用的数据表有10989251行,因此必须有一种有效的子集设置方法。
按“用户”分组if
all
,“类型”中的元素只有前三个LETTERS
,我们得到Data.table(.SD
)的子集。我在这里使用%chin%
矢量进行比较,因为它是针对矢量进行%in%
优化的较快版本character
。
dt[, if(all(type %chin% LETTERS[1:3])) .SD, by = user]
# user type
#1: a A
#2: a C
#3: a B
#4: b A
#5: b C
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句