我正在试图弄清楚如何根据三个变量(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的最高值。
如果有人能想出更好的方法来做到这一点或让我完成最后一点,我会非常感激。谢谢大家!
答案 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)]
)