【问题标题】:R: Remove duplicated value conditionally between row keeping the one with less NAR:有条件地删除行之间的重复值,保留具有较少NA的行
【发布时间】:2016-01-07 22:08:56
【问题描述】:

我想知道一种在 R 中删除表中重复值的方法。问题是我的重复行带有 NA 而有些则没有。我想最好只保留包含 1) 没有 NA 或 2) 可能的 NA 数量较少的行。这是一个示例数据框:

mat.test=matrix(c(NA,NA,2,NA,NA,NA,NA,3,1,2,2,2,NA,2,3,1,2,4),byrow = T, 6,3)
colnames(mat.test)=c("MBL","MBW","MBD")
df=as.data.frame(mat.test)
df$BAND=c("JP3540","JP3540","JP3540","JP1500","JP2500","JP2500")
df$Date=c("2012-07-23","2012-07-22","2012-07-24","2011-09-03","2011-09-01","2011-09-02")
df

#MBL MBW MBD   BAND       Date
#1  NA  NA   2 JP3540 2012-07-23
#2  NA  NA  NA JP3540 2012-07-22
#3  NA   3   1 JP3540 2012-07-24
#4   2   2   2 JP1500 2011-09-03
#5  NA   2   3 JP2500 2011-09-01
#6   1   2   4 JP2500 2011-09-02

我想按日期对数据进行排序,因为我想最好保留第一个重复值:

 z <- df[order(df$Date, decreasing=F),]

我知道对于这种大小的数据集,我可以手动删除它们。但我想让它自动化。这是我想要的最终输出。

#  MBL MBW MBD   BAND       Date
#6   1   2   4 JP2500 2011-09-02
#4   2   2   2 JP1500 2011-09-03
#3  NA   3   1 JP3540 2012-07-24

希望你能帮助我!谢谢。

【问题讨论】:

    标签: r dataframe duplicates


    【解决方案1】:

    查看na.omit(your data frame)

    【讨论】:

      【解决方案2】:

      我们通过'BAND'split数据集创建一个list的数据集,获取前三列的最大非NA元素的位置,子集数据集和rbind它。

      res <- do.call(rbind,lapply(split(df, df$BAND), 
              function(x) x[which.max(rowSums(!is.na(x[1:3]))),]))
      row.names(res) <- NULL
      res
      #  MBL MBW MBD   BAND       Date
      #1   2   2   2 JP1500 2011-09-03
      #2   1   2   4 JP2500 2011-09-02
      #3  NA   3   1 JP3540 2012-07-24
      

      【讨论】:

        猜你喜欢
        • 2014-11-24
        • 2017-01-10
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 2021-03-08
        • 2022-06-13
        • 1970-01-01
        相关资源
        最近更新 更多