2017-07-14 5 views
0

Ich habe eine Liste, die aussieht wie List_Lookup. Jede Liste in der Liste enthält eine unterschiedliche Anzahl von Einträgen.R Extrahieren von Listenkomponenten zum Erstellen eines data.frame

ListCodes <- list(List1 = c(1,2,3), List2 = c(5,2,4,3,6)) 
DF_Lookup <- data.frame(CODE = c(1,2,3,4,5,6), NAME = c("AAA111", "BBB222","CCC333","DDD444","EEE555","FFF666")) 
List_Lookup <- lapply(ListCodes, function(x) DF_Lookup$NAME[x]) 

Was ich nach ist so etwas wie ListDF wo jede Paarung von Listennamen und Listeneintrag eine eindeutige Zeile in einem Datenrahmen ist. Ich bin mir sicher, dass es eine einfache Lösung dafür gibt, ich finde es nur schwer es zu finden.

ListDF <- data.frame(LIST = c("List1","List1","List1","List2","List2","List2","List2","List2"), NAME = c("AAA111", "BBB222","CCC333","EEE555","BBB222","DDD444","CCC333","FFF666")) 
+3

'Stapel (lapply (List_Lookup, as.character))' – Psidom

+0

@Psidom Bitte als Antwort posten. – Roland

Antwort

3

Sie können stack verwenden, um die Listennamen in eine Spalte zu konvertieren und Werte in eine andere aufzulisten; Hier ist in den Dokumenten ?stack:

Stacking Vektoren mehr Vektoren in einen einzigen Vektor zusammen mit einem Faktor verkettet angibt, wo jede Beobachtung stammte.

stack(lapply(List_Lookup, as.character)) 

# values ind 
#1 AAA111 List1 
#2 BBB222 List1 
#3 CCC333 List1 
#4 EEE555 List2 
#5 BBB222 List2 
#6 DDD444 List2 
#7 CCC333 List2 
#8 FFF666 List2 

Um die gewünschten Spaltennamen ein:

setNames(stack(lapply(List_Lookup, as.character)), c("CODE", "LIST")) 

# CODE LIST 
#1 AAA111 List1 
#2 BBB222 List1 
#3 CCC333 List1 
# ... 
+1

Danke. Das macht genau das, wonach ich suche. Ich wusste, dass ich etwas Einfaches vermisste! – Chris

1

Sie können die Liste auf eine data.frame mit purrr::imap_dfr, konvertieren, die Sie einfach anschließen lassen würde:

library(tidyverse) 

ListCodes <- list(List1 = c(1,2,3), 
        List2 = c(5,2,4,3,6)) 
DF_Lookup <- data.frame(CODE = c(1,2,3,4,5,6), 
         NAME = c("AAA111", "BBB222","CCC333","DDD444","EEE555","FFF666")) 

ListCodes %>% 
    imap_dfr(~data_frame(LIST = .y, CODE = .x)) %>% # convert into data.frame 
    full_join(DF_Lookup, by = 'CODE') 
#> # A tibble: 8 x 3 
#> LIST CODE NAME 
#> <chr> <dbl> <fctr> 
#> 1 List1  1 AAA111 
#> 2 List1  2 BBB222 
#> 3 List1  3 CCC333 
#> 4 List2  5 EEE555 
#> 5 List2  2 BBB222 
#> 6 List2  4 DDD444 
#> 7 List2  3 CCC333 
#> 8 List2  6 FFF666 

%>% select(-CODE) hinzufügen, wenn Sie die Spalte mehr nicht beitreten wollen.

+0

Welche Version von 'tidyverse' enthält' imap_dfr'? – CPak

+0

Mist, ja ich vergesse immer wieder, dass sie diese Version noch nicht für CRAN freigegeben haben. Sie können die Entwicklungsversion mit 'devtools :: install_github ('tidyverse/purrr')' – alistaire

+0

installieren Ah, danke für die Info – CPak

Verwandte Themen