繁体   English   中英

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

[英]R extracting list components to create a data.frame

我有一个看起来像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"))

您可以使用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
# ...

您可以使用purrr::imap_dfr将列表转换为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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM