在 R/list 中如何合并/rbind 子数据帧

and*_*ang 2 r list dataframe

有列表ori_list,如何组合子数据框cat_a|cat_btocatitem_a|item_bto item?(结果与 new_list 相同)

cat_a <- data.frame(name=c('A','B','C'),amount=c(1,2,3))
cat_b <- data.frame(name=c('w','B','C'),amount=c(4,2,3))
item_a <- data.frame(name=c('z','o','C'),amount=c(3,4,1))
item_b <- data.frame(name=c('n','B','C'),amount=c(6,6,3))

files <- ls(pattern = 'cat|item') %>% purrr::set_names()

ori_list <- list(mget(files))

new_list <- list(cat= data.frame(name = c('A','B','C','w','B','C'),
                            amount = c(1,2,3,4,2,3)),
                 item = data.frame(name=c('z','o','C','n','B','C'),
                                   amount=c(3,4,1,6,6,3)))
Run Code Online (Sandbox Code Playgroud)

jay*_*.sf 5

尝试这个。请注意,您使用了mget错误,它已经生成了一个列表。

ori_list <- mget(files)

list(cat=do.call('rbind', ori_list[grep('^cat', names(ori_list))]),
     item=do.call('rbind', ori_list[grep('^item', names(ori_list))]))
# $cat
#         name amount
# cat_a.1    A      1
# cat_a.2    B      2
# cat_a.3    C      3
# cat_b.1    w      4
# cat_b.2    B      2
# cat_b.3    C      3
# 
# $item
#          name amount
# item_a.1    z      3
# item_a.2    o      4
# item_a.3    C      1
# item_b.1    n      6
# item_b.2    B      6
# item_b.3    C      3
Run Code Online (Sandbox Code Playgroud)

你也可以这样做,

lapply(c('cat', 'item'), \(x) do.call('rbind', mget(ls(pattern=x, envir=.GlobalEnv), envir=.GlobalEnv))) |>
  setNames(c('cat', 'item'))
# $cat
#         name amount
# cat_a.1    A      1
# cat_a.2    B      2
# cat_a.3    C      3
# cat_b.1    w      4
# cat_b.2    B      2
# cat_b.3    C      3
# 
# $item
#          name amount
# item_a.1    z      3
# item_a.2    o      4
# item_a.3    C      1
# item_b.1    n      6
# item_b.2    B      6
# item_b.3    C      3
Run Code Online (Sandbox Code Playgroud)

这可能会更好。