Listen in dataframes

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Listen in dataframes

Beitrag von wbart »

Guten Morgen,

ich hoffe ihr hattet ein schönes Wochenende und der Karneval/Fasching steckt euch nicht mehr allzusehr in den Knochen. Ich habe mal wieder ein Problem. An dieser Stelle schon mal Vorab einen großen Dank an alle die mir bislang so geduldig geholfen haben.
Zu meinem Problem. Ich habe aus einer großen Anzahl von lm() (zur Hypothesenbildung!) die Coeffizienten Werte ausgelesen. Diese versuche ich nun in eine Tabell zu schreiben. Leider gelingt es mir nicht ganz. Mit

Code: Alles auswählen

data_frame <- as.data.frame(do.call(rbind, list_coef))
kann ich zwar Teile der Liste erfassen aber nicht alle. Ich bin leider nicht in der Lage die Liste artifiziell nachzubilden (was ja schon einiges aussagt), deshalb versuche ich sie euch mit Teildarstellungen nachvollziehbar zu machen.

Code: Alles auswählen

 >list_coef
 $ENSG00000070759
                        Estimate  Std. Error    t value   Pr(>|t|)
(Intercept)          0.71315355 0.525232349  1.3577868 0.18275483
a                       0.01722368 0.006828225  2.5224240 0.01608637
b                       0.01440139 0.082725305  0.1740869 0.86274617
c                       0.10401800 0.081379137  1.2781900 0.20914305
d                       0.03376825 0.126238375  0.2674959 0.79057285
e                     -0.16738079 0.082067265 -2.0395561 0.04858342
f                      0.12819923 0.083063189  1.5433940 0.13124592
g                     0.09308393 0.089991501  1.0343636 0.30767983

 $ENSG000000345
 etc.
 
die str() sieht dann so aus:

Code: Alles auswählen

> str(list_coef)
List of 15050
 $ ENSG00000000003: num [1:8, 1:4] 5.437658 0.000613 -0.024308 -0.028092 0.002952 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:8] "(Intercept)" "a" "b" "c" ...
  .. ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)"
 $ ENSG00000000419: num [1:8, 1:4] 5.03 6.01e-05 -2.78e-02 -2.43e-03 -1.55e-02 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:8] "(Intercept)" "a" "b" "c" ...
  .. ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)"
  
  etc.
  

Die Struktur in der View Ansicht erscheint so:
list1.jpg
Das Ziel ist eine Tabelle in der die "namen" widerholt vor den Coeffizienten stehen.

name Estimate Std. Error t value Pr(>|t|)
ENSG00000000003 (Intercept) 0.71315355 0.525232349 1.3577868 0.18275483
ENSG00000000003 a 0.01722368 0.006828225 2.5224240 0.01608637
ENSG00000000003 b 0.01440139 0.082725305 0.1740869 0.86274617
ENSG00000000003 c 0.10401800 0.081379137 1.2781900 0.20914305
ENSG00000000003 d 0.03376825 0.126238375 0.2674959 0.79057285
ENSG00000000003 e -0.16738079 0.082067265 -2.0395561 0.04858342
ENSG00000000003 f 0.12819923 0.083063189 1.5433940 0.13124592
ENSG00000000003 g 0.09308393 0.089991501 1.0343636 0.30767983

nächster name... etc.

Habt ihr eine Idee?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Listen in dataframes

Beitrag von bigben »

Du weist ja, wie sehr wir auf reproduzierbare Beispiele als gemeinsame Ausgangsbasis stehen, damir wir alle über das gleiche sprechen. Schau mal, ob das hier als reproduzierbares Beispiel infrage kommt und was da jetzt noch genau fehlt:

Code: Alles auswählen

library(broom)
bsp <- replicate(5, 
                 expr = {lm(formula = y ~ a + b + c,
                            data = data.frame(y = rnorm(10), a = rnorm(10), 
                                              b = rnorm(10), c = rnorm(10))
                           ) |> tidy() |> data.frame()},
                 simplify = FALSE
       )
names(bsp) = c("Modell_1", "Modell_2", "Modell_3", "Modell_4", "Modell_5")

str(bsp)
#> List of 5
#>  $ Modell_1:'data.frame':    4 obs. of  5 variables:
#>   ..$ term     : chr [1:4] "(Intercept)" "a" "b" "c"
#>   ..$ estimate : num [1:4] -0.0574 0.3329 -0.3257 0.0686
#>   ..$ std.error: num [1:4] 0.21 0.216 0.197 0.212
#>   ..$ statistic: num [1:4] -0.273 1.542 -1.651 0.324
#>   ..$ p.value  : num [1:4] 0.794 0.174 0.15 0.757
#>  $ Modell_2:'data.frame':    4 obs. of  5 variables:
#>   ..$ term     : chr [1:4] "(Intercept)" "a" "b" "c"
#>   ..$ estimate : num [1:4] -0.6793 -0.3242 -0.187 -0.0999
#>   ..$ std.error: num [1:4] 0.61 0.665 0.532 0.562
#>   ..$ statistic: num [1:4] -1.113 -0.488 -0.351 -0.178
#>   ..$ p.value  : num [1:4] 0.308 0.643 0.737 0.865
#>  $ Modell_3:'data.frame':    4 obs. of  5 variables:
#>   ..$ term     : chr [1:4] "(Intercept)" "a" "b" "c"
#>   ..$ estimate : num [1:4] -0.0879 -0.6915 -0.0524 0.5936
#>   ..$ std.error: num [1:4] 0.454 0.364 0.335 0.537
#>   ..$ statistic: num [1:4] -0.194 -1.901 -0.157 1.106
#>   ..$ p.value  : num [1:4] 0.853 0.106 0.881 0.311
#>  $ Modell_4:'data.frame':    4 obs. of  5 variables:
#>   ..$ term     : chr [1:4] "(Intercept)" "a" "b" "c"
#>   ..$ estimate : num [1:4] -0.48367 -0.00058 0.17886 0.43607
#>   ..$ std.error: num [1:4] 0.414 0.309 0.924 0.399
#>   ..$ statistic: num [1:4] -1.16924 -0.00188 0.19362 1.09334
#>   ..$ p.value  : num [1:4] 0.287 0.999 0.853 0.316
#>  $ Modell_5:'data.frame':    4 obs. of  5 variables:
#>   ..$ term     : chr [1:4] "(Intercept)" "a" "b" "c"
#>   ..$ estimate : num [1:4] 0.0206 -0.1116 -0.7866 -0.5843
#>   ..$ std.error: num [1:4] 0.429 0.391 0.467 0.394
#>   ..$ statistic: num [1:4] 0.048 -0.286 -1.686 -1.485
#>   ..$ p.value  : num [1:4] 0.963 0.785 0.143 0.188
head(bsp, 3)
#> $Modell_1
#>          term    estimate std.error  statistic   p.value
#> 1 (Intercept) -0.05743317 0.2101201 -0.2733349 0.7937608
#> 2           a  0.33291559 0.2158612  1.5422668 0.1739487
#> 3           b -0.32566237 0.1972552 -1.6509699 0.1498355
#> 4           c  0.06857854 0.2115031  0.3242437 0.7567591
#> 
#> $Modell_2
#>          term    estimate std.error  statistic   p.value
#> 1 (Intercept) -0.67928164 0.6103265 -1.1129807 0.3083086
#> 2           a -0.32423217 0.6647413 -0.4877569 0.6430316
#> 3           b -0.18697016 0.5320187 -0.3514353 0.7372739
#> 4           c -0.09989429 0.5623284 -0.1776440 0.8648481
#> 
#> $Modell_3
#>          term    estimate std.error  statistic   p.value
#> 1 (Intercept) -0.08789679 0.4535778 -0.1937855 0.8527379
#> 2           a -0.69147625 0.3637297 -1.9010717 0.1060122
#> 3           b -0.05244602 0.3347132 -0.1566894 0.8806291
#> 4           c  0.59356407 0.5368793  1.1055819 0.3112566


do.call(rbind, bsp)
#>                   term      estimate std.error   statistic   p.value
#> Modell_1.1 (Intercept) -0.0574331670 0.2101201 -0.27333490 0.7937608
#> Modell_1.2           a  0.3329155878 0.2158612  1.54226676 0.1739487
#> Modell_1.3           b -0.3256623663 0.1972552 -1.65096995 0.1498355
#> Modell_1.4           c  0.0685785388 0.2115031  0.32424369 0.7567591
#> Modell_2.1 (Intercept) -0.6792816441 0.6103265 -1.11298071 0.3083086
#> Modell_2.2           a -0.3242321723 0.6647413 -0.48775695 0.6430316
#> Modell_2.3           b -0.1869701603 0.5320187 -0.35143531 0.7372739
#> Modell_2.4           c -0.0998942939 0.5623284 -0.17764404 0.8648481
#> Modell_3.1 (Intercept) -0.0878967932 0.4535778 -0.19378550 0.8527379
#> Modell_3.2           a -0.6914762544 0.3637297 -1.90107171 0.1060122
#> Modell_3.3           b -0.0524460205 0.3347132 -0.15668941 0.8806291
#> Modell_3.4           c  0.5935640713 0.5368793  1.10558192 0.3112566
#> Modell_4.1 (Intercept) -0.4836739859 0.4136665 -1.16923642 0.2866524
#> Modell_4.2           a -0.0005801796 0.3090631 -0.00187722 0.9985631
#> Modell_4.3           b  0.1788572995 0.9237473  0.19362146 0.8528608
#> Modell_4.4           c  0.4360710289 0.3988433  1.09333928 0.3161861
#> Modell_5.1 (Intercept)  0.0206043012 0.4293897  0.04798508 0.9632855
#> Modell_5.2           a -0.1116210058 0.3908871 -0.28555816 0.7848184
#> Modell_5.3           b -0.7865800497 0.4666492 -1.68559187 0.1428522
#> Modell_5.4           c -0.5842554361 0.3935166 -1.48470344 0.1881595
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Listen in dataframes

Beitrag von wbart »

Hallo bigben,

die bsp Liste trifft die Gegebenheiten nicht ganz. Im Unterschied zu deiner Struktur die aus 5 Listen a 1:4 besteht, ist die original Liste [1:8], [1:4] aufgebaut. Deine Struktur ist mir viel verständlicher, in meiner Struktur tauchen die Zahlen unter "$ name " auf, die y -Achse (Zeilenbeschriftung, Intercept, a, b,....) als Liste [1:8] und die Spaltenüberschriften(Estimate,...) als [1:4] liste. Wie R es schafft das zusammenzusetzen ist mir schleierhaft.

Code: Alles auswählen

> str(list_coef)
List of 15050
 $ ENSG00000000003: num [1:8, 1:4] 5.437658 0.000613 -0.024308 -0.028092 0.002952 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:8] "(Intercept)" "a" "b" "c" ...
  .. ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)"
 $ ENSG00000000419: num [1:8, 1:4] 5.03 6.01e-05 -2.78e-02 -2.43e-03 -1.55e-02 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:8] "(Intercept)" "a" "b" "c" ...
  .. ..$ : chr [1:4] "Estimate" "Std. Error" "t value" "Pr(>|t|)"
  
  etc.

Code: Alles auswählen

do.call(rbind, bsp) 

angwendet auf meine Liste ergibt, dass die Koeffizienten untereinander geschrieben werden der "name" aber fehlt
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Listen in dataframes

Beitrag von bigben »

Anscheinend hast Du keine data.frames, sondern Arrays in Deiner Liste stehen? Vielleicht wäre es sinnvoll zu schauen, wo/wie die entstehen.

Ansonsten: Hast Du die Namen noch irgendwo anders stehen, sodass man sie als zusätzliche nachträglich ergänzen könnte?

Wenn nein, ließe sich ein reproduzierbares Beispiel Deines Datenformats vielleicht so erzeugen?

Code: Alles auswählen

dput( list(list_coef[[1]], list_coef[[2]], list_coef[[3]], list[[4]]))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Listen in dataframes

Beitrag von wbart »

Vielleicht hift folgender Ansatz:

Code: Alles auswählen

coef_table <- tibble(Variable = names(list_coef), coef = unlist(list_coef))
führt zu folgender Fehlermeldung

Code: Alles auswählen

Error:
! Tibble columns must have compatible sizes.
* Size 15050: Existing data.
* Size 481600: Column `coef`.
i Only values of size one are recycled.
Antworten