我的列表看起来像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"))
答案 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)
。