按组计算观察值并仅保留属于至少两组的观察值

时间:2015-09-16 14:59:04

标签: r

我有以下数据框:

id    group
1     A
1     B
1     C
2     A
3     A
3     B

我想创建一个变量来计算每个人所属的群组数量,并根据我希望仅在具有多个群组的个人中保留在数据框中的变量。在这种情况下,id 2将被删除。我知道我可以算做

table(data$group)

但是我还没有能够用它去除那些只有一组的人。

3 个答案:

答案 0 :(得分:3)

假设OP只需要'id'来保持'group'中lengthunique元素大于1,我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(data)),按'ID'分组,我们返回Data.table的子集(.SDif { “group”中length个元素的{1}}大于1.(uniqueuniqueN的方便包装器)

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中。