我有一个数据集,我希望根据另一个变量中是否有不同的ID来删除重复的观察结果。在以下示例中,对于任何时间" id"匹配两个不同的编码员",我想删除其中一个编码员的所有观察结果:
df <- data.frame(id = c(1,1,1,2,2,3,3,3, 4, 5), coder = c("A", "A", "B", "A", "B", "A", "B", "A", "B", "A"), y = c(4,5,4,1,1,2,3,2, 5, 6))
df
在这种情况下,如果有两个不同的编码器,我想删除与ID匹配的观察,并且只保留由&#34; A&#34;对于那些案件;我想保留所有没有匹配的观察结果。使用此规则,数据集应如下所示:
id coder y
1 1 A 4
2 1 A 5
4 2 A 1
6 3 A 2
8 3 A 2
9 4 B 5
9 5 A 6
答案 0 :(得分:3)
我会使用ave
来确定每个coder
是否有多个id
,然后使用逻辑来要求您的子集每coder
{{}} 1}},或id
每个coder
和id
多个{&#34; A&#34;。
coder
这会产生所需的结果。
df <- data.frame(id = c(1,1,1,2,2,3,3,3, 4, 5),
coder = c("A", "A", "B", "A", "B", "A", "B", "A", "B", "A"),
y = c(4,5,4,1,1,2,3,2, 5, 6),
stringsAsFactors=FALSE)
temp <- with(df, ave(coder, id, FUN=function(x) length(unique(x))))
df[((temp == 1) | ((temp > 1) & (df$coder == "A"))), ]
答案 1 :(得分:2)
使用data.table
library(data.table)
setDT(df)[, .SD[length(unique(coder))==1|coder=="A"], by=list(id)]
# id coder y
# 1: 1 A 4
# 2: 1 A 5
# 3: 2 A 1
# 4: 3 A 2
# 5: 3 A 2
# 6: 4 B 5
# 7: 5 A 6
答案 2 :(得分:1)
这是dplyr
方法:
library(dplyr)
df %>%
group_by(id) %>%
filter(coder == "A" | n_distinct(coder) == 1)
#Source: local data frame [7 x 3]
#Groups: id
#
# id coder y
#1 1 A 4
#2 1 A 5
#3 2 A 1
#4 3 A 2
#5 3 A 2
#6 4 B 5
#7 5 A 6