2017-09-24 1 views
1

J'ai une liste de vecteurs nommés:R - liste en COERCE dataframe, en gardant la colonne-variables ensemble

> x <- list(c(a=1, b=2, c=3, d=4),c(a=5, b=6 ,c=7 ,d=8),c(a=32, c=46, d=55, e=100)) 
> x 
[[1]] 
a b c d 
1 2 3 4 

[[2]] 
a b c d 
5 6 7 8 

[[3]] 
    a c d e 
32 46 55 100 

Je voudrais forcer cela en une data.frame telle que les valeurs nommées de la même tombent dans une colonne :

> y <- data.frame(a=c(1,5,32), b=c(2,6,NA), c=c(3,7,46), d=c(4,8,55), e=c(NA,NA,100)) 
> y 
    a b c d e 
1 1 2 3 4 NA 
2 5 6 7 8 NA 
3 32 NA 46 55 100 

Y at-il un moyen facile de le faire?

Répondre

1

essayer avec le dplyr package:

require(dplyr) 

data.frame(bind_rows(!!! x)) 

#or for a tibble, use: bind_rows(!!! x) 

Sortie:

a b c d e 
1 1 2 3 4 NA 
2 5 6 7 8 NA 
3 32 NA 46 55 100 
2

Vous pouvez le faire facilement avec purrr::map_df et dplyr::bind_rows

library(purrr) 
library(dplyr) 
map_df(x,bind_rows) 

# A tibble: 3 x 5 
     a  b  c  d  e 
    <dbl> <dbl> <dbl> <dbl> <dbl> 
1  1  2  3  4 NA 
2  5  6  7  8 NA 
3 32 NA 46 55 100 
+0

Je ne peux pas appeler la fonction map_df sous dplyr :: > Bibliothèque (dplyr) > map_df (x, bind_rows) 錯誤: 沒有 這個 函數 "m ap_df " – Sati

+0

Désolé - il est dans' purrr' pas 'dplyr'! Modifié ci-dessus. –

+0

Maintenant, c'est cette erreur: > map_df (x, bind_rows) Erreur dans as_mapper (.f, ...): impossible de trouver l'objet 'bind_rows' – Sati

2

Nous pouvons utiliser data.table

library(data.table) 
rbindlist(lapply(x, as.data.frame.list), fill = TRUE) 
# a b c d e 
#1: 1 2 3 4 NA 
#2: 5 6 7 8 NA 
#3: 32 NA 46 55 100 

Ou en utilisant base R

un1 <- unique(unlist(lapply(x, names))) 
do.call(rbind, lapply(x, function(y) { 
    y[setdiff(un1, names(y))] <- NA 
    y[un1]})) 
0

Considérons la base R:

df <- do.call(rbind, lapply(x, function(i) 
          data.frame(a=i['a'], b=i['b'], c=i['c'], 
             d=i['d'], e=i['e']))) 
row.names(df) <- NULL 

df 
# a b c d e 
# 1 1 2 3 4 NA 
# 2 5 6 7 8 NA 
# 3 32 NA 46 55 100