2012-05-31 23 views
8

Mam ramkę danych w R zawierającą kolumny ID.A, ID.B i DISTANCE, gdzie odległość oznacza odległość między ID.A a ID.B. Dla każdej wartości (1-> n) ID.A, może być wiele wartości ID.B i DISTANCE (tj. Może być wiele duplikatów w ID.A np. Cała wartość 4, z których każda ma inny ID.B i odległość w tym rzędzie).R, warunkowo usuń duplikaty wierszy

Chciałbym móc usuwać wiersze, w których ID.A jest powielony, ale uwarunkowane wartością odległości taką, że pozostaję z najmniejszymi wartościami odległości dla każdego rekordu ID.A.

Mam nadzieję, że ma to sens?

Wiele z góry dzięki

EDIT

Mam nadzieję, że przykład okaże się bardziej przydatna niż mojego tekstu. Tutaj chciałbym usunąć drugiego i trzeciego wiersze gdzie 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) 

Odpowiedz

5

Można użyć pakietu plyr za to. Na przykład, jeśli dane są takie jak:

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 

Można użyć funkcji ddply takiego:

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

co daje:

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

Można również zrobić to łatwo w podstawa R. Jeśli Twoja ramka danych to dat,

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

Jedną z możliwości:

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

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

Co daje:

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

co szukałem, dzięki –