Ich habe eine Liste wie folgt aus:eine Liste in einen Datenrahmen mit bestimmten Titel Converting
$20
[1] 500
$30
[2] 600
Ich möchte dies wie diese in einen Datenrahmen konvertieren
id values
20 500
30 600
Ich habe eine Liste wie folgt aus:eine Liste in einen Datenrahmen mit bestimmten Titel Converting
$20
[1] 500
$30
[2] 600
Ich möchte dies wie diese in einen Datenrahmen konvertieren
id values
20 500
30 600
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
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))
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
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
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
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
Wäre das nicht 'Daten.Rahmen (id = Namen (L), Werte = unlist (L)) 'kürzer sein? – Abdou
Ja, nette Lösung. Ich habe über längere Vektoren nachgedacht (und nehme nur das erste Element). – jogo