2012-06-21 7 views
5

Tengo un marco de datos que relaciona los números de botella con sus volúmenes (key en el ejemplo a continuación). Quiero escribir una función que tome cualquier lista de números de botella (samp) y devolver una lista de los volúmenes de botellas mientras se mantiene el orden del número de botella en samp.¿Cómo puedo fusionar y mantener el orden de fila de una entrada?

La función siguiente coincide correctamente con los números y volúmenes de las botellas, pero ordena la salida por el número de botella ascendente.

¿Cómo puedo mantener el orden de samp con merge? El establecimiento de sort=FALSE da como resultado un "orden no especificado".

Ejemplo

samp <- c(9, 1, 4, 1) 
num <- 1:10 
vol <- sample(50:100, 10) 
key <- data.frame(num, vol) 
matchFun <- function(samp, key) 
    { 
    out <- merge(as.data.frame(samp), key, by.x="samp", by.y="num") 
    return(out$vol) 
    } 
+2

¿En serio? Está en el manual. Lee '? Merge'; 'sort = TRUE' es el valor predeterminado ... –

+3

que no parece mantener el orden original de' samp' por alguna razón, aunque ... – KennyPeanuts

+12

Bien mierda, me disculpo. 'sort = FALSE' devuelve las filas en un" orden no especificado ". Parece que necesito RTFM. ;-) Trae los votos por "gran comentario". Me gusta mi cuervo bien hecho. –

Respuesta

2

Usted puede hacer esto con match y subconjuntos de key por el resultado:

bottles <- key[match(samp, key$num),] 
# rownames are odd because they must be unique, clean them up 
rownames(bottles) <- seq(NROW(bottles)) 
+0

Joshua, ¿no debería ser 'match (key $ num, samp)' en su lugar? Porque de acuerdo con '? Match', la duración del resultado es la duración del primer argumento. Es mejor utilizar la sintaxis '% in%' para evitar dicha confusión: 'clave [clave $ num% en% samp,]'. También tenga en cuenta que puede restablecer los nombres de fila fácilmente simplemente asignando NULL, sin necesidad de creación de secuencia explícita. – TMS

+0

@Tomas: OP quería un resultado de la longitud de 'samp'. 'match (clave $ num, samp)' produce varios 'NA' y' key '[key $ num% in% samp,] 'falta una fila y está en el orden incorrecto. Estoy de acuerdo con tu comentario 'rownames <-'. –

+0

Joshua, debo admitir que no tenía suficiente energía para entender la situación particular del OP. Lo que me confunde es que 'match (samp, key $ num)' es TRUE/FALSE vector will de longitud de 'samp' en lugar de length de' key', lo cual es un poco raro cuando lo usas para subdividir la tecla ' ', o al menos inusual. Si esto funciona, entonces solo en esta situación particular ... – TMS

2

join en el paquete plyr es ideal para esto ...

samp <- c(9, 1, 4, 1) 
num <- 1:10 
vol <- sample(50:100, 10) 
key <- data.frame(num, vol) 
samp<-as.data.frame(samp) 
names(samp)<-"num" 
library("plyr") 
join(key,samp,type="right") 
Cuestiones relacionadas