[英]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.