2012-05-31 29 views
8

Tengo un marco de datos en R que contiene las columnas ID.A, ID.B y DISTANCE, donde la distancia representa la distancia entre ID.A e ID.B. Para cada valor (1-> n) de ID.A, puede haber valores múltiples de ID.B y DISTANCE (es decir, puede haber múltiples filas duplicadas en ID.A, por ejemplo, todas de valor 4, cada una con una ID.B diferente). y distancia en esa fila).R, eliminar condicionalmente filas duplicadas

Me gustaría poder eliminar las filas donde ID.A está duplicado, pero depende del valor de la distancia, de modo que me quedan los valores de distancia más pequeños para cada registro de ID.A.

Espero que tenga sentido?

Muchas gracias de antemano

EDITAR

Con suerte un ejemplo resultarán más útiles que mi texto. Aquí me gustaría para eliminar la segunda y tercera filas en las que 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) 

Respuesta

5

Usted puede utilizar el paquete plyr para eso. Por ejemplo, si los datos son como éstos:

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 

Usted puede utilizar la función ddply así:

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

que da:

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

También puede hacerlo fácilmente en base R. Si dat es su marco de datos,

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

Una posibilidad:

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

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

que da:

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

lo que estaba buscando, gracias –

Cuestiones relacionadas