2017-04-19 1 views

Antwort

1

Sie do.call verwenden können, lösen Ihr Problem:

li <- list(`20`=500,`30`=600) 
df <- data.frame(Values = do.call("rbind",li)) 
df$Id <- rownames(df) 
rownames(df) <- NULL 
df <- df[,c(2,1)] 
df 

Ausgang:

> df 
    Id Values 
1 20 500 
2 30 600 
3

können Sie tun:

L <- list(`20`=500,`30`=600) 
df <- data.frame(id=names(L), values=sapply(L, function(x) x[1])) 
# > df 
# id values 
# 20 20 500 
# 30 30 600 

oder ein wenig komplizierter:

df <- data.frame(id=names(L), values=sapply(L, '[', 1)) 

Bis jetzt über längere Vektoren zu denken (nur das erste Element und nehmen) war ich. Aber in Ihrem Fall (wenn jedes Element der Liste ist nur ein 1-Element-Vektor) eine kürzere Lösung (thx to Abdou für den Kommentar) ist:

df <- data.frame(id = names(L), values = unlist(L)) 
+3

Wäre das nicht 'Daten.Rahmen (id = Namen (L), Werte = unlist (L)) 'kürzer sein? – Abdou

+0

Ja, nette Lösung. Ich habe über längere Vektoren nachgedacht (und nehme nur das erste Element). – jogo

0

purrr des *_df Funktionen eine Funktion über eine Liste iterieren und vereinfachen zu einem data.frame. Mit der Entwicklung Version, können Sie die neue imap Variante verwenden, die die Namen oder Indizes als zweite Variable .y verwendet: purrr

library(purrr) 

l <- list(`25` = 900, `26` = 500) 

l %>% imap_dfr(~data.frame(id = as.integer(.y), 
          value = .x)) 
#> id value 
#> 1 25 900 
#> 2 26 500 

oder mit CRAN, können Sie die Namen wie die zweite Variable map2 passieren:

l %>% map2_df(names(.), 
       ~data.frame(id = as.integer(.y), 
          value = .x)) 
#> id value 
#> 1 25 900 
#> 2 26 500 
0

einfache Art und Weise die gleichen durch die Verwendung von melt Funktion von reshape2 Paket zu erreichen.

library(reshape2) 
l = list('20'=500, '30'=600) 
melt(as.data.frame(l, check.names = F)) 

Ausgang:

variable value 
1  20 500 
2  30 600 

Alternative Ansatz ohne jedes Paket mit

ls = list('20' = 500, '30' = 600, '40' = 400) 
d = data.frame('id' = row.names(as.array(unlist(ls))), 'value' = unlist(ls),row.names = 1:length(ls)) 

Ausgabe

id value 
1 20 500 
2 30 600 
3 40 700 
4 50 800 
0

Verwendung fehlende oder Funktion.

L = list(`20`=500,`30`=600) 
df = unlist(L) 

Es gibt Vektor zurück. Wenn Sie data.frame wollen:

df = as.data.frame(t(unlist(L))) 

Ausgang:

> df 
    20 30 
1 500 600 
0

Hier ist eine Lösung mit Map

l <- list(`20`=500,`30`=600) 
do.call(rbind,Map(data.frame,id=names(l),values=l)) 

    id values 
20 20 500 
30 30 600 
Verwandte Themen