2012-05-31 51 views
8

Tôi có một khung dữ liệu trong R chứa các cột ID.A, ID.B và DISTANCE, trong đó khoảng cách thể hiện khoảng cách giữa ID.A và ID.B. Đối với mỗi giá trị (1-> n) của ID.A, có thể có nhiều giá trị ID.B và DISTANCE (nghĩa là có thể có nhiều hàng trùng lặp trong ID. Ví dụ: tất cả giá trị 4 mà mỗi ID có ID khác nhau. và khoảng cách trong hàng đó).R, có điều kiện xóa các hàng trùng lặp

Tôi muốn có thể xóa các hàng mà ID.A được sao chép, nhưng có điều kiện theo giá trị khoảng cách sao cho tôi bị bỏ lại với các giá trị khoảng cách nhỏ nhất cho mỗi bản ghi ID.A.

Hy vọng điều đó có ý nghĩa?

Nhiều cảm ơn trước

EDIT

Hy vọng rằng một ví dụ sẽ chứng minh có ích hơn văn bản của tôi. Ở đây tôi muốn xóa hàng thứ hai và thứ ba có 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) 

Trả lời

5

Bạn có thể sử dụng gói plyr cho điều đó. Ví dụ, nếu dữ liệu của bạn là như thế này:

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 

Bạn có thể sử dụng ddply chức năng như thế này:

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

Mà cho:

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

Bạn cũng có thể làm điều đó một cách dễ dàng trong cơ sở R. Nếu dat là khung dữ liệu của bạn,

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

Một khả năng:

myDF <- myDF[order(myDF$ID.A, myDF$DISTANCE), ] 

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

Mà cho:

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

những gì tôi đang tìm kiếm, nhờ –

Các vấn đề liên quan