R,有条件地删除重复行
Posted
技术标签:
【中文标题】R,有条件地删除重复行【英文标题】:R, conditionally remove duplicate rows 【发布时间】: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)
【问题讨论】:
【参考方案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
【讨论】:
以上是关于R,有条件地删除重复行的主要内容,如果未能解决你的问题,请参考以下文章