根据ID变量删除重复项?

时间:2014-08-04 19:36:39

标签: r duplicate-removal

我有一个数据集,我希望根据另一个变量中是否有不同的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

3 个答案:

答案 0 :(得分:3)

我会使用ave来确定每个coder是否有多个id,然后使用逻辑来要求您的子集每coder {{}} 1}},或id每个coderid多个{&#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