R提取列表组件以创建data.frame

时间:2017-07-14 15:04:19

标签: r list dataframe

我的列表看起来像List_Lookup。列表中的每个列表包含不同数量的条目。

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以使用purrr::imap_dfr将列表转换为data.frame,这样您就可以加入:

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)