2012-05-31 66 views
8

我有一個R中的數據框,包含列ID.A,ID.B和DISTANCE,其中距離表示ID.A和ID.B之間的距離。對於ID.A的每個值(1-> n),可能存在ID.B和DISTANCE的多個值(即,在ID.A中可能有多個重複行,例如所有值爲4,每個值具有不同的ID.B和該行的距離)。R,有條件地刪除重複的行

我希望能夠刪除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) 

回答

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 
7

你也可以做到這一點很容易地在base R.如果dat是您的數據框,則爲

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

一種可能性:

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 
+1

什麼,我一直在尋找,謝謝 –