2017-12-17 10 views
0

Ich stecke auf nested map() oder vielleicht map() pipe.R map() 2 Ebenen in die Liste

Ich habe eine Liste der 4 Ausgänge in Objekt „Ausgang“. In jedem der vier Ausgaben gibt es ein Element "Parameter", das eine Liste von 3 Elementen ist. Das 1. Element ist „unstandardized“

Aus dem View Tool, das ich den Code sehen kann, die nicht standardisierten Parameter von einem Ausgang

output[["ar.4g_gm.pr.dual..semi.inv..phantom.out"]][["parameters"]][["unstandardized"]]) 

ich versucht hat zu bekommen Karte über Ausgänge verwenden Parameter verrohrt in map_dfr Extrahieren extrahieren und die nicht standardisierten Parameter rbind, die den Job ...

x<- map(output,"parameters") %>% map_dfr("unstandardized") 

aber ich mag den Top-Level-Liste Elementnamen haben (dh die Ausgabedatei) in einer Spalte von meinem Ergebnis.

Gibt es eine Möglichkeit zu nisten die Karte Funktionen oder eine andere Syntax, um die vier Top-Level-Liste Elementnamen in eine Spalte zu bekommen?

Hier Aussagen mit Dummy-Daten. Ich tworks, aber ich muss rep (c "out1", "out2", "out3", jeweils = 5) zu dem Ergebnis und ich möchte es ohne cbind passieren.

output <- list(out1=list(e1=c(1,2,3), 
          e2=c(T,F,T), 
         parm=list(a = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            b = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            stand = cbind(as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)),grp=rep(1,times=5)))), 
       out2=list(e1=c(3,4,5), 
         e2=c(T,F,T), 
         parm=list(a = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            b = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            stand = cbind(as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)),grp=rep(2,times=5)))), 
       out3=list(e1=c(1,2,3), 
         e2=c(T,F,T), 
         parm=list(a = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            b = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            stand = cbind(as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)),grp=rep(3,times=5))))) 

output[["out1"]][["parm"]][["stand"]]    

map(output,"parm") %>% map_dfr("stand") 
+2

Lassen Sie sich die Daten, verwenden 'dput' und copy/paste ein minimales, reproduzierbares Beispiels für alle zu sehen. – tyluRp

+0

hinzugefügt Beispieldaten –

Antwort

1
library(purrr) 
library(dplyr) 

map(output, pluck, "parm", "stand") %>% 
    bind_rows(.id = "foo") 
#  foo V1 V2 V3 V4 V5 V6 V7 V8 grp 
# 1 out1 845 527 296 902 358 447 317 347 1 
# 2 out1 679 473 290 482 349 691 144 731 1 
# 3 out1 842 574 135 894 628 542 757 174 1 
# 4 out1 379 548 836 176 796 744 889 922 1 
# 5 out1 498 837 492 965 255 508 138 689 1 
# 6 out2 203 599 158 355 793 884 722 210 2 
# 7 out2 543 693 484 195 511 174 793 654 2 
# 8 out2 593 839 296 926 387 788 260 143 2 
# 9 out2 373 363 323 939 416 348 792 211 2 
# 10 out2 773 218 616 806 119 304 775 775 2 
# 11 out3 171 217 859 899 664 737 114 837 3 
# 12 out3 953 225 600 581 528 388 714 899 3 
# 13 out3 615 550 860 134 667 136 987 993 3 
# 14 out3 494 407 726 128 559 418 782 832 3 
# 15 out3 729 734 432 354 716 288 734 264 3 
+0

Ich konnte es nicht mit 'imap_dfr' arbeiten lassen, wie ich es dachte (imap_dfr (output, ~ pluck (.x, "parm", "stand")), .id = "foo") '). Im Zweifelsfall habe ich ein GitHub-Problem auf https://github.com/tidyverse/purrr/issues/429 –

+0

geöffnet, danke Aurèle, es macht den Job mit .id = also bin ich gut. Ich wollte wirklich zupfen(), obwohl ich dachte, ich wüsste nicht, dass es Pluck hieß. –

1
output <- list(out1=list(e1=c(1,2,3), 
         e2=c(T,F,T), 
         parm=list(a = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            b = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            stand = cbind(as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)),grp=rep(1,times=5)))), 
       out2=list(e1=c(3,4,5), 
         e2=c(T,F,T), 
         parm=list(a = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            b = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            stand = cbind(as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)),grp=rep(2,times=5)))), 
       out3=list(e1=c(1,2,3), 
         e2=c(T,F,T), 
         parm=list(a = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            b = as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)), 
            stand = cbind(as.data.frame(matrix(sample(101:999,size=40,replace=TRUE),nrow=5)),grp=rep(3,times=5))))) 

library(tidyverse) 

map(output,"parm") %>% 
    map("stand") %>% 
    map2(names(output), ~ cbind(.x, df_name=.y)) 

# $out1 
# V1 V2 V3 V4 V5 V6 V7 V8 grp df_name 
# 1 695 356 109 463 688 496 842 310 1 out1 
# 2 922 450 680 170 567 921 530 419 1 out1 
# 3 568 604 626 446 364 206 541 644 1 out1 
# 4 210 237 300 432 366 945 413 368 1 out1 
# 5 529 224 392 181 156 126 255 283 1 out1 
# 
# $out2 
# V1 V2 V3 V4 V5 V6 V7 V8 grp df_name 
# 1 320 429 109 749 394 657 690 764 2 out2 
# 2 580 296 755 101 385 582 956 547 2 out2 
# 3 939 122 697 146 747 108 672 836 2 out2 
# 4 550 972 128 396 874 224 158 133 2 out2 
# 5 923 650 888 895 742 166 533 225 2 out2 
# 
# $out3 
# V1 V2 V3 V4 V5 V6 V7 V8 grp df_name 
# 1 347 928 777 656 503 783 847 620 3 out3 
# 2 496 586 919 991 810 797 779 202 3 out3 
# 3 644 731 441 896 284 514 954 981 3 out3 
# 4 303 803 945 806 938 692 587 775 3 out3 
# 5 243 666 719 823 133 773 585 461 3 out3 
+0

Dank AntoniosK. Ich denke, ich könnte das in rbind pipen, um die Listenelemente zusammenzustellen. Ich bin froh, einen Weg zu sehen, ohne zu rupfen() –