我有以下数据:
ID category class
1 a m
1 a s
1 b s
2 a m
3 b s
4 c s
5 d s
我想通过仅包含具有多个(> 1
)不同类别的“ID”来对数据进行子集化。
我的预期输出:
ID category class
1 a m
1 a s
1 b s
有办法吗?
我试过
library(dplyr)
df %>%
group_by(ID) %>%
filter(n_distinct(category, class) > 1)
但它给了我一个错误:
# Error: expecting a single value
答案 0 :(得分:3)
使用data.table
library(data.table) #see: https://github.com/Rdatatable/data.table/wiki for more
setDT(data) #convert to native 'data.table' type by reference
data[ , if(uniqueN(category) > 1) .SD, by = ID]
uniqueN
是data.table
的{{1}}(快速)原生掩码,而length(unique())
只是整个.SD
(在更一般情况下,它是data.table
可以表示列的子集,例如,当.SDcols
参数被激活时。所以基本上中间语句(j
,列选择参数)表示返回与ID
相关联的所有列和行,其中至少有两个不同的category
值。
使用by
参数扩展到涉及多个列的计数的案例。