首页 > 解决方案 > 如何在R中的单个列表中添加两个元素

问题描述

我有一个由 22 个数据框组成的列表,每个数据框都是 excel 文件中的一张表。每个 DF 都包含我使用 read_excel 函数加载到 R 中的特定城市财务详细信息。有几个城市有两个分支机构,因此我需要合并这两个城市。如何在 R 中执行此操作。

可重现的脚本:

> bng1 <- data.frame(parameters = c('cost','emp_count','revenue'), values = c(125,50,200))
> chn <- data.frame(parameters = c('cost','emp_count','revenue'), values = c(100,45,180))
> bng2 <- data.frame(parameters = c('cost','emp_count','revenue'), values = c(25,10,100))
> 
> mylist <- list(bng1,chn,bng2) #I got my list by creating a function using lapply and read_excel to read data into R
> mylist 
[[1]]
  parameters values
1       cost    125
2  emp_count     50
3    revenue    200

[[2]]
  parameters values
1       cost    100
2  emp_count     45
3    revenue    180

[[3]]
  parameters values
1       cost     25
2  emp_count     10
3    revenue    100

我需要结合 bng1 和 bng2 的详细信息,然后我将得到一个由两个 DF 组成的列表:chn 和 bng1 or(2)。

预期输出:

mylist
[[1]]
  parameters  values
1       cost     150
2  emp_count      60     
3    revenue     300

[[2]]
  parameters   values
1       cost      100 
2  emp_count       45
3    revenue      180

我使用 lapply 来添加或减去列表中每个元素的特定行/列等

lapply(list, function(x) x[a,] +/- x[b,])

但我不知道如何在一个列表中合并不同的元素。有人可以让我知道如何执行相同的操作。

标签: rlist

解决方案


如果您的列表已命名,您可以执行

names(mylist) <- c("bng1","chn","bng2")
list(aggregate(values~parameters, do.call(rbind, mylist[c("bng1", "bng2")]), 
               sum), mylist[["chn"]])

#[[1]]
#  parameters values
#1       cost    150
#2  emp_count     60
#3    revenue    300

#[[2]]
#  parameters values
#1       cost    100
#2  emp_count     45
#3    revenue    180

或按位置

list(aggregate(values~parameters, do.call(rbind, mylist[c(1, 3)]),
               sum), mylist[[2]])

并类似地使用dplyr

library(dplyr)

list(bind_rows(mylist[c(1, 3)]) %>%
            group_by(parameters) %>%
            summarise(values = sum(values)), mylist[[2]])

推荐阅读