2017-11-27 3 views
0

Ich habe eine Liste, die aus Listen besteht, die alle vier Elemente enthalten. Es sieht wie folgt aus:R - Umwandlung einer Liste in einen Datenrahmen

> summary(allMorans) 
         Length Class Mode 
trait1     4  -none- list 
trait2     4  -none- list 
trait3     4  -none- list 
traitB     4  -none- list 
traitX     4  -none- list 

Die vier Elemente sind das Ergebnis eines bestimmten statistischen Tests und enthalten die Elemente „beobachtet“, „erwartet“, „sd“, „p-Wert“.

Wenn ich dies tun:

MoransResults <- as.data.frame(allMorans) 

ich eine einzige sehr lange Reihe erhalten, die wie folgt aussieht:

trait1.observed trait1.expected trait1.sd  trait1.pvalue  trait2.observed trait2.expected trait2.sd  trait2.pvalue ...etc 
0.1    0.2    0.01   0.09    0.3    0.2    0.01   0.07    ...etc 

Ich brauche aber diese Liste der Listen in einen Datenrahmen zu drehen, das aussieht wie folgt:

TRAIT observed expected sd  pvalue 
trait1 0.1  0.2  0.01 0.09 
trait2 0.3  0.2  0.01 0.07 
trait3 0.1  0.1  0.01 0.55 
traitB 0.2  0.2  0.01 0.49 
traitX 0.3  0.2  0.01 0.07 

Wie erreiche ich das?

UPDATE:

Wie in den Kommentaren aufgefordert, hier einige Beispieldaten:

> dput(allMorans) 
structure(list(trait1 = structure(list(observed = -0.00820649454281412, 
expected = -0.0001000100010001, sd = 6.44860382275647e-05, 
p.value = 0), .Names = c("observed", "expected", "sd", "p.value" 
)), trait2 = structure(list(observed = -0.16378930443073, expected = -0.0001000100010001, 
sd = 6.44860728086603e-05, p.value = 0), .Names = c("observed", 
"expected", "sd", "p.value")), trait3 = structure(list(observed = -0.348047732487769, 
expected = -0.0001000100010001, sd = 6.44872069930741e-05, 
p.value = 0), .Names = c("observed", "expected", "sd", "p.value" 
))), .Names = c("trait1", "trait2", "trait3")) 
+1

Es ist nicht wirklich genug, nur zu beschreiben, was wie Ihre Daten sind. Sie müssen tatsächliche Beispieldaten in die Frage einschließen (z. B. 'dput (allMorans)') – dww

+1

Ok danke, ich werde das zur Frage hinzufügen! - fertig - fertig! – Abdel

Antwort

3

In Basis R (keine zusätzlichen Bibliotheken erforderlich)

do.call(rbind, lapply(allMorans, as.data.frame)) 
#   observed expected   sd p.value 
#trait1 -0.008206495 -0.00010001 6.448604e-05  0 
#trait2 -0.163789304 -0.00010001 6.448607e-05  0 
#trait3 -0.348047732 -0.00010001 6.448721e-05  0 
+0

Ja, das funktioniert, danke, ihr seid großartig. – Abdel

+0

anstelle von 'lapply' können Sie einfach' sapply' und die Identity-Funktion als 't (sapply (allMorans, I))' verwenden, obwohl das beste ist, s 'simplify2array' zu verwenden, das immer noch in Base R ist – Onyambu

1

Eine Lösung mit dem tidyverse Paket. as.tibble konvertieren Sie jedes Element in der Liste zu einem tibble. map_dfr kann dann alle diese tibbles kombinieren, um den endgültigen Ausgang zu bilden.

library(tidyverse) 

dt <- allMorans %>% map_dfr(as.tibble, .id = "TRAIT") 
dt 
# # A tibble: 3 x 5 
# TRAIT  observed expected   sd p.value 
# <chr>  <dbl>  <dbl>  <dbl> <dbl> 
# 1 trait1 -0.008206495 -0.00010001 6.448604e-05  0 
# 2 trait2 -0.163789304 -0.00010001 6.448607e-05  0 
# 3 trait3 -0.348047732 -0.00010001 6.448721e-05  0 
4

Eine weitere Alternative:

t(simplify2array(allMorans)) 

#   observed  expected    sd p.value 
#trait1 -0.008206495 -0.00010001 6.448604e-05  0  
#trait2 -0.1637893 -0.00010001 6.448607e-05  0  
#trait3 -0.3480477 -0.00010001 6.448721e-05  0 
Verwandte Themen