【问题标题】:R, conditionally remove duplicate rowsR,有条件地删除重复行
【发布时间】:2012-06-05 19:25:56
【问题描述】:

我在 R 中有一个数据框,其中包含 ID.A、ID.B 和 DISTANCE 列,其中距离表示 ID.A 和 ID.B 之间的距离。对于 ID.A 的每个值 (1->n),可能有多个 ID.B 和 DISTANCE 值(即 ID.A 中可能有多个重复行,例如所有值 4,每个都有不同的 ID.B和那一行的距离)。

我希望能够删除 ID.A 重复的行,但以距离值为条件,以便我为每个 ID.A 记录留下最小的距离值。

希望这是有道理的?

在此先感谢

编辑

希望一个例子比我的文字更有用。这里我想删除 ID.A = 3 的第二行和第三行:

myDF <- read.table(text="ID.A ID.B DISTANCE
  1 3 1
  2 6 8
  3 2 0.4
  3 3 1
  3 8 5
  4 8  7
  5 2 11", header = TRUE)

【问题讨论】:

    标签: r conditional duplicates


    【解决方案1】:

    您也可以在基础 R 中轻松完成。如果 dat 是您的数据框,

    do.call(rbind, 
            by(dat, INDICES=list(dat$ID.A), 
               FUN=function(x) head(x[order(x$DISTANCE), ], 1)))
    

    【讨论】:

      【解决方案2】:

      一种可能性:

      myDF <- myDF[order(myDF$ID.A, myDF$DISTANCE), ] 
      
      newdata <- myDF[which(!duplicated(myDF$ID.A)),]
      

      这给出了:

          ID.A ID.B DISTANCE
      1    1    3      1.0
      2    2    6      8.0
      5    3    2      0.4
      6    4    8      7.0
      7    5    2     11.0
      

      【讨论】:

        【解决方案3】:

        您可以为此使用plyr 包。例如,如果您的数据是这样的:

        d <- data.frame(id.a=c(1,1,1,2,2,3,3,3,3),
                        id.b=c(1,2,3,1,2,1,2,3,4),
                        dist=c(12,10,15,20,18,16,17,25,9))
        
          id.a id.b dist
        1    1    1   12
        2    1    2   10
        3    1    3   15
        4    2    1   20
        5    2    2   18
        6    3    1   16
        7    3    2   17
        8    3    3   25
        9    3    4    9
        

        您可以像这样使用ddply 函数:

        library(plyr)
        ddply(d, "id.a", function(df) return(df[df$dist==min(df$dist),]))
        

        这给出了:

          id.a id.b dist
        1    1    2   10
        2    2    2   18
        3    3    4    9
        

        【讨论】:

          猜你喜欢
          • 2015-08-31
          • 2021-06-09
          • 2021-11-25
          • 2018-02-17
          • 2021-12-11
          • 2020-05-22
          • 2017-10-23
          • 2022-01-02
          • 2017-09-22
          相关资源
          最近更新 更多