2017-07-14 37 views
0

我有一個看起來像List_Lookup的列表。列表中的每個列表都包含不同數量的條目。R提取列表組件以創建數據。框架

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]) 

什麼我以後是一樣的東西ListDF其中列表名稱和列表項的每個配對是在數據幀唯一行。我確信有一個簡單的解決方案,我只是很難找到它。

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

'堆棧(lapply(List_Lookup,as.character))' – Psidom

+0

@Psidom請張貼作爲一個答案。 – Roland

回答

3

您可以使用stack將列表名稱轉換爲一列並將值列表轉換爲另一列;下面是從文檔?stack

堆疊載體串接多個向量成單個矢量 與指示因​​子,其中每個觀測起源沿。

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 

要設置所需的列名:

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

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

謝謝。這正是我所追求的。我知道我錯過了一些簡單的事情! – Chris

1

您可以將列表轉換爲一個data.frame與purrr::imap_dfr,這將讓你簡單地加入:

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)如果你不想再連接列。

+0

哪個版本的'tidyverse'包含'imap_dfr'? – CPak

+0

廢話,是的,我一直忘記他們還沒有將該版本發佈到CRAN。你可以用'devtools :: install_github('tidyverse/purrr')' – alistaire

+0

安裝開發版本啊,謝謝你的信息 – CPak