2017-07-14 67 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