R,有条件地删除重复行

9
我有一个R dataframe包含ID.A、ID.B和DISTANCE三个列,其中distance表示ID.A和ID.B之间的距离。对于每个ID.A值(1-n),可能存在多个ID.B和DISTANCE值(即ID.A中可能有多个重复行,例如所有值为4的行,该行中有不同的ID.B和distance)。
我想要删除ID.A重复的行,但是有条件地删除,条件是保留每个ID.A记录的最小distance值。
希望这样表述清楚了?
非常感谢!
编辑
希望例子比我的文字更有用。在这里,我想删除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)
3个回答

7
您可以在基本的R语言中轻松完成此操作。如果dat是您的数据框,
do.call(rbind, 
        by(dat, INDICES=list(dat$ID.A), 
           FUN=function(x) head(x[order(x$DISTANCE), ], 1)))

7

一种可能性:

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

5
你可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接