Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据帧合并到两个不同的列表中,并键入R中的元素名称_R_List_Merge_Concat - Fatal编程技术网

将数据帧合并到两个不同的列表中,并键入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))