将数据帧合并到两个不同的列表中,并键入R中的元素名称
我有两个列表将数据帧合并到两个不同的列表中,并键入R中的元素名称,r,list,merge,concat,R,List,Merge,Concat,我有两个列表list1和list2,每个列表都包含数据帧或数据表,这些数据帧或数据表由它们的名称唯一标识。我想结合键入数据集名称的list1和list2。我希望两个列表的元素都出现在组合列表中。我从stackoverflow中尝试了很多解决方案,比如do.call(c,list1,list2),Map(c,list1,list2)或mappy,merge,list.join。我获得的最大成功是创建数据帧名称的键,并使用键的Map,但它们没有在组合列表中保留不匹配的元素,类似于键您可以尝试使用列表
list1
和list2
,每个列表都包含数据帧或数据表,这些数据帧或数据表由它们的名称唯一标识。我想结合键入数据集名称的list1
和list2
。我希望两个列表的元素都出现在组合列表中。我从stackoverflow中尝试了很多解决方案,比如do.call(c,list1,list2)
,Map(c,list1,list2)
或mappy
,merge
,list.join
。我获得的最大成功是创建数据帧名称的键,并使用键的Map
,但它们没有在组合列表中保留不匹配的元素,类似于键您可以尝试使用列表1
和列表2
中的唯一的名称,就像您已经尝试过的那样,然后使用它们来设置名称
:
keys <- unique(c(names(list1), names(list2)))
x <- setNames(Map(rbind, list1[keys], list2[keys]), keys)
identical(x, combined_list)
#[1] TRUE
对于任意数量的data.frames列表,也可以使用split
和rbind
:
ll <- do.call('c', list(list1, list2))
lapply(split(ll, names(ll)), function(x){
do.call('rbind', args = c(x, list(make.row.names = F)))
})
# $a
# id type
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 6 16 p
# 7 17 q
# 8 18 r
# 9 19 s
# 10 20 t
#
# $b
# id type
# 1 6 f
# 2 7 g
# 3 8 h
# 4 9 i
# 5 10 j
# 6 21 u
# 7 22 v
# 8 23 w
# 9 24 x
# 10 25 y
#
# $c
# id type
# 1 11 k
# 2 12 l
# 3 13 m
# 4 14 n
# 5 15 o
#
# $e
# id type
# 1 26 z
# 2 27 ab
# 3 28 ac
# 4 29 ad
# 5 30 ae
#
# $f
# id type
# 1 31 ba
# 2 32 bb
# 3 33 bc
# 4 34 bd
# 5 35 be
ll如果我正确理解了您的问题,一个选项是在一个data.frame/tibble中获取两个列表,然后按组拆分为列表项:
library(purrr)
library(dplyr)
df_of_lists <- dplyr::union(list1 %>%
purrr::map_df(as.data.frame, .id = 'name'),
list2 %>%
purrr::map_df(as.data.frame, .id = 'name'))
split(df_of_lists, f = df_of_lists$name ) %>%
# in case you want to remove the new name colum
purrr::map( ~ .x %>% dplyr::select(-name))
库(purrr)
图书馆(dplyr)
df_的_列表%
purrr::map_df(as.data.frame,.id='name'),
列表2%>%
purrr::map_df(as.data.frame,.id='name'))
拆分(列表的df\u,f=df\u列表的df\u$name)%>%
#如果您想删除新名称colum
purrr::map(~.x%>%dplyr::select(-name))
非常感谢。您使用setNames的解决方案工作得非常出色。此解决方案的工作原理与上面的setNames函数类似。
x <- lapply(setNames(keys, keys), function(x) {rbind(list1[[x]], list2[[x]])})
identical(x, combined_list)
#[1] TRUE
ll <- do.call('c', list(list1, list2))
lapply(split(ll, names(ll)), function(x){
do.call('rbind', args = c(x, list(make.row.names = F)))
})
# $a
# id type
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 6 16 p
# 7 17 q
# 8 18 r
# 9 19 s
# 10 20 t
#
# $b
# id type
# 1 6 f
# 2 7 g
# 3 8 h
# 4 9 i
# 5 10 j
# 6 21 u
# 7 22 v
# 8 23 w
# 9 24 x
# 10 25 y
#
# $c
# id type
# 1 11 k
# 2 12 l
# 3 13 m
# 4 14 n
# 5 15 o
#
# $e
# id type
# 1 26 z
# 2 27 ab
# 3 28 ac
# 4 29 ad
# 5 30 ae
#
# $f
# id type
# 1 31 ba
# 2 32 bb
# 3 33 bc
# 4 34 bd
# 5 35 be
library(purrr)
library(dplyr)
df_of_lists <- dplyr::union(list1 %>%
purrr::map_df(as.data.frame, .id = 'name'),
list2 %>%
purrr::map_df(as.data.frame, .id = 'name'))
split(df_of_lists, f = df_of_lists$name ) %>%
# in case you want to remove the new name colum
purrr::map( ~ .x %>% dplyr::select(-name))