删除重复项,但保持最完整的迭代

时间:2016-08-25 18:46:00

标签: r duplicates

我正在试图弄清楚如何根据三个变量(id, key, and num)删除重复项。我想删除填充最少量列的副本。如果填写了相同的数字,则可以删除其中任何一个。 例如,

Original <- data.frame(id= c(1,2,2,3,3,4,5,5), 
key=c(1,2,2,3,3,4,5,5),
num=c(1,1,1,1,1,1,1,1),
v4= c(1,NA,5,5,NA,5,NA,7), 
v5=c(1,NA,5,5,NA,5,NA,7))

输出如下:

Finished <- data.frame(id= c(1,2,3,4,5),
key=c(1,2,3,4,5),
num=c(1,1,1,1,1),
v4= c(1,5,5,5,7),
v5=c(1,5,5,5,7))

我的真实数据集更大,主要是数字,但有些字符变量混合,但我无法确定最佳方法。我以前使用的程序在duplicates命令中执行类似的操作,名为check.all。

到目前为止,我的想法是使用grepl并确定“任何”存在的位置

Present <- apply(Original, 2, function(x) grepl("[[:alnum:]]", x))

然后,使用结果数据帧我请求rowSums并将其绑定到原始数​​据。

CompleteNess <- rowSums(Present)
cbind(Original, CompleteNess)

这是我不确定下一步的地方......我有一个变量告诉我每行填充了多少列(CompleteNess);但是,我不确定如何实现重复。

简单地说,我正在寻找当id,key和num重复时 - 保持行具有CompleteNess的最高值。

如果有人能想出更好的方法来做到这一点或让我完成最后一点,我会非常感激。谢谢大家!

2 个答案:

答案 0 :(得分:3)

这是一个解决方案。它不是很漂亮,但它应该适用于您的应用程序:

a

这会重新排列原始数据框,因此请注意以后是否有其他处理。

答案 1 :(得分:2)

您可以汇总数据并选择具有最高分数的行:

Original <- data.frame(id= c(1,2,2,3,3,4,5,5), 
                       key=c(1,2,2,3,3,4,5,5),
                       num=c(1,1,1,1,1,1,1,1),
                       v4= c(1,NA,5,5,NA,5,NA,7), 
                       v5=c(1,NA,5,5,NA,5,NA,7))
Present <- apply(Original, 2, function(x) grepl("[[:alnum:]]", x))

#get the score 
Original$present <- rowSums(Present)

#create a column to aggregate on
Original$id.key.num <- paste(Original$id, Original$key, Original$num, sep = "-")

library("plyr")
#aggregate here
Final <- ddply(Original,.(id.key.num),summarize,
      Max = max(present))

如果您想保留其他列,请执行以下操作:

Final <- ddply(Original,.(id.key.num),summarize,
      Max = max(present),
      v4 = v4[which.max(present)],
      v5 = v5[which.max(present)]
      )