JSn*_*012 8 conditional r duplicates
我在R中有一个包含ID.A,ID.B和DISTANCE列的数据帧,其中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)
Run Code Online (Sandbox Code Playgroud)
您也可以在基础R中轻松完成.如果dat是您的数据框,
do.call(rbind,
by(dat, INDICES=list(dat$ID.A),
FUN=function(x) head(x[order(x$DISTANCE), ], 1)))
Run Code Online (Sandbox Code Playgroud)
一种可能性:
myDF <- myDF[order(myDF$ID.A, myDF$DISTANCE), ]
newdata <- myDF[which(!duplicated(myDF$ID.A)),]
Run Code Online (Sandbox Code Playgroud)
这使 :
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
Run Code Online (Sandbox Code Playgroud)
您可以使用该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
Run Code Online (Sandbox Code Playgroud)
你可以使用这样的ddply功能:
library(plyr)
ddply(d, "id.a", function(df) return(df[df$dist==min(df$dist),]))
Run Code Online (Sandbox Code Playgroud)
这使 :
id.a id.b dist
1 1 2 10
2 2 2 18
3 3 4 9
Run Code Online (Sandbox Code Playgroud)