7 votes

Comment puis-je fusionner et maintenir l'ordre des lignes d'une entrée ?

J'ai un tableau de données qui relie les numéros de bouteilles à leurs volumes (clé dans l'exemple ci-dessous). Je veux écrire une fonction qui prendra n'importe quelle liste de numéros de bouteilles (samp) et renverra une liste des volumes de bouteilles tout en maintenant l'ordre des numéros de bouteilles dans samp.

La fonction ci-dessous associe correctement les numéros de bouteilles et les volumes, mais trie la sortie par numéro de bouteille croissant.

Comment puis-je maintenir l'ordre de samp avec merge? Définir sort=FALSE entraîne un "ordre non spécifié".

Exemple

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)
  }

4voto

Joshua Ulrich Points 68776

Vous pouvez faire cela avec match et en sous-ensembles key par le résultat:

bouteilles <- key[match(samp, key$num),]
# Les noms de ligne sont impairs car ils doivent être uniques, nettoyez-les
rownames(bottles) <- seq(NROW(bottles))

3voto

gjabel Points 3617

join dans le package plyr est parfait pour cela...

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")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X