【发布时间】:2015-09-16 14:59:04
【问题描述】:
我有以下数据框:
id group
1 A
1 B
1 C
2 A
3 A
3 B
我想创建一个变量来计算每个人所属的组数,并基于此变量,我只想将那些拥有多个组的人保留在数据框中。在这种情况下 id 2 将被删除。我知道我可以通过做来数数
table(data$group)
但我无法使用它来删除只有一组的人。
【问题讨论】:
标签: r
我有以下数据框:
id group
1 A
1 B
1 C
2 A
3 A
3 B
我想创建一个变量来计算每个人所属的组数,并基于此变量,我只想将那些拥有多个组的人保留在数据框中。在这种情况下 id 2 将被删除。我知道我可以通过做来数数
table(data$group)
但我无法使用它来删除只有一组的人。
【问题讨论】:
标签: r
假设 OP 只需要保留“组”中 unique 元素的 length 大于 1 的“id”,我们可以使用 data.table。我们将'data.frame'转换为'data.table'(setDT(data)),按'ID'分组,我们返回Data.table的子集(.SD)iflength的unique 'group' 中的元素大于 1。(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 替换为 length(group)>1
我们是否可以仅使用“id”列进行子集化还是需要“group”列中的length(unique,尚不完全清楚。如果我们只使用'id',一个选项是duplicated
data[duplicated(data$id)|duplicated(data$id, fromLast=TRUE),]
# id group
#1 1 A
#2 1 B
#3 1 C
#5 3 A
#6 3 B
【讨论】:
length(unique(group))>1
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 出现多个值。
【讨论】:
使用 dplyr:
library(dplyr)
df %>%
group_by(id) %>%
filter(length(group) > 1)
@Frank 建议
或者,如果您想检查唯一性(组)而不是长度(组):
df %>%
group_by(id) %>%
filter(n_distinct(group) > 1)
【讨论】:
n_distinct(group)>1