【问题标题】:Remove Duplicates, but Keep the Most Complete Iteration删除重复项,但保留最完整的迭代
【发布时间】:2016-08-26 03:43:49
【问题描述】:

我试图弄清楚如何根据三个变量 (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))

我的真实数据集更大,并且混合了大部分数字变量,但还有一些字符变量,但我无法确定执行此操作的最佳方法。我以前使用过一个程序,它可以在名为 check.all 的重复命令中执行类似的操作。

到目前为止,我的想法是使用 grepl 并确定“任何东西”在哪里

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

然后,使用生成的数据框,我要求 rowSums 并将其 Cbind 到原始数据。

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

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

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

如果有人能想到更好的方法来做到这一点或让我度过最后一点,我将不胜感激。谢谢大家!

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

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

    #Order by the degree of completeness    
    Original<-Original[order(CompleteNess),]
    
    #Starting from the bottom select the not duplicated rows 
    #based on the first 3 columns
    Original[!duplicated(Original[,1:3], fromLast = TRUE),]
    

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

    【讨论】:

      【解决方案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)]
            )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 2015-03-19
        • 2021-10-25
        • 2022-07-19
        • 2019-10-27
        • 1970-01-01
        相关资源
        最近更新 更多