我有以下数据框:
id group
1 A
1 B
1 C
2 A
3 A
3 B
我想创建一个变量来计算每个人所属的群组数量,并根据我希望仅在具有多个群组的个人中保留在数据框中的变量。在这种情况下,id 2将被删除。我知道我可以算做
table(data$group)
但是我还没有能够用它去除那些只有一组的人。
答案 0 :(得分:3)
假设OP只需要'id'来保持'group'中length
个unique
元素大于1,我们可以使用data.table
。我们将'data.frame'转换为'data.table'(setDT(data)
),按'ID'分组,我们返回Data.table的子集(.SD
)if
{ “group”中length
个元素的{1}}大于1.(unique
是uniqueN
的方便包装器)
length(unique(.
注意:如果仅基于 library(data.table)#v1.9.5+
setDT(data)[,if(uniqueN(group)>1) .SD , by = id]
# id group
#1: 1 A
#2: 1 B
#3: 1 C
#4: 3 A
#5: 3 B
,我们会将length
替换为uniqueN(group)>1
目前尚不完全清楚我们是否可以仅使用“id”列进行分组,还是需要“group”列中的length(group)>1
。如果我们仅使用'id',则一个选项是length(unique
duplicated
答案 1 :(得分:3)
使用dplyr:
library(dplyr)
df %>%
group_by(id) %>%
filter(length(group) > 1)
@Frank建议
或者,如果要检查唯一(组)而不是长度(组):
df %>%
group_by(id) %>%
filter(n_distinct(group) > 1)
答案 2 :(得分:3)
df[df$id %in% names(which(table(df$id) > 1)),]
# id group
#1 1 A
#2 1 B
#3 1 C
#5 3 A
#6 3 B
使用table
方法,您可以检查哪些ID出现多次。假设每个组出现一次id。
<强>更新强>
df[df$id %in% names(which(rowSums(!!(table(df$id, df$group))) > 1)),]
我添加了对第二列的引用,以防多个值出现在同一个id中。