选择每组具有多个不同值的组

Way*_*nja 4 r subset

我有如下数据:

ID  category class
1   a        m  
1   a        s
1   b        s
2   a        m
3   b        s
4   c        s
5   d        s
Run Code Online (Sandbox Code Playgroud)

我想通过仅包含那些具有多个 ( > 1) 不同类别的“ID”来对数据进行子集化。

我的预期输出:

ID  category class
1   a        m
1   a        s
1   b        s
Run Code Online (Sandbox Code Playgroud)

有没有办法这样做?

我试过

library(dplyr)
df %>% 
  group_by(ID) %>%
  filter(n_distinct(category, class) > 1)
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误:

# Error: expecting a single value
Run Code Online (Sandbox Code Playgroud)

Mic*_*ico 5

使用 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]
Run Code Online (Sandbox Code Playgroud)

uniqueNisdata.table的(快速)原生掩码length(unique()),并且.SD只是整体data.table(在更一般的情况下,它可以表示列的子集,例如当.SDcols参数被激活时)。所以基本上中间语句(j,列选择参数)说要返回与 a 相关联的所有列和行ID,其中至少有两个不同的category.

使用该by参数扩展到涉及对多列进行计数的情况。