web-dev-qa-db-fra.com

Puis-je combiner une liste de trames de données similaires en une trame de données unique?

J'ai une trame de données:

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
            df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))

Puis-je le convertir en une seule trame de données du formulaire:

data.frame(x = c('a', 'b', 'c', 'd', 'e', 'f'), y= c(1,2,3,4,5,6))

?

31
David LeBauer

do.call("rbind", foo) devrait faire l'affaire.

67
Hong Ooi

avec plyr:

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
        df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))

library(plyr)
ldply(foo)[,-1]
  x y
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6
8
Sacha Epskamp

Il y a plusieurs problèmes avec votre code.

La première est que l'instruction d'affectation dans la liste ne fonctionne pas. Cela doit être corrigé, par exemple:

foo <- list(
        df1 = data.frame(x=c('a', 'b', 'c'), y = c(1,2,3)), 
        df2 = data.frame(x=c('d', 'e', 'f'), y = c(4,5,6))
)

Vous pouvez ensuite utiliser rbind () pour combiner les trames de données:

rbind(foo$df1, foo$df2)

  x y
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6

Mais cela pose plus de questions. Par exemple, pourquoi combinez-vous les trames de données dans une liste en premier lieu. La seconde est de savoir si vous devez vraiment utiliser des trames de données plutôt que des vecteurs. Enfin, j'essaye généralement d'éviter rbind () et j'utilise plutôt merge () lors de la combinaison de trames de données de cette manière.

3
Andrie

Que diriez-vous de merge(foo[[1]], foo[[2]], all = TRUE)

1
Chase