r - 如何对数据框列表中的每个数据框进行分组和汇总
问题描述
我有一个数据框列表:
df1 <- data.frame(one = c('red','blue','green','red','red','blue','green','green'),
one.1 = as.numeric(c('1','1','0','1','1','0','0','0')))
df2 <- data.frame(two = c('red','yellow','green','yellow','green','blue','blue','red'),
two.2 = as.numeric(c('0','1','1','0','0','0','1','1')))
df3 <- data.frame(three = c('yellow','yellow','green','green','green','white','blue','white'),
three.3 = as.numeric(c('1','0','0','1','1','0','0','1')))
all <- list(df1,df2,df3)
我需要按第一列对每个数据框进行分组并总结第二列。个人我会做这样的事情:
library(dplyr)
df1 <- df1 %>%
group_by(one) %>%
summarise(sum = sum(one.1))
但是,我无法弄清楚如何遍历列表中的每个项目。
我想过使用循环:
for(i in 1:3){
all[i] <- all[i] %>%
group_by_at(1) %>%
summarise()
}
但是我不知道如何在 summarise() 函数中指定要求和的列(无论如何,这个循环可能在其他方面都是错误的)。
理想情况下,我需要输出是另一个列表,每个项目都是汇总数据,如下所示:
[[1]]
# A tibble: 3 x 2
one sum
<fct> <dbl>
1 blue 1
2 green 0
3 red 3
[[2]]
# A tibble: 4 x 2
two sum
<fct> <dbl>
1 blue 1
2 green 1
3 red 1
4 yellow 1
[[3]]
# A tibble: 4 x 2
three sum
<fct> <dbl>
1 blue 0
2 green 2
3 white 1
4 yellow 1
非常感谢任何帮助!
解决方案
这是一个基本的 R 解决方案:
lapply(all, function(DF) aggregate(list(added = DF[, 2]), by = DF[, 1, drop = F], FUN = sum))
[[1]]
one added
1 blue 1
2 green 0
3 red 3
[[2]]
two added
1 blue 1
2 green 1
3 red 1
4 yellow 1
[[3]]
three added
1 blue 0
2 green 2
3 white 1
4 yellow 1
另一种方法是将列表绑定为一个。在这里,我使用data.table
并避免使用名称。唯一的问题是这可能会混淆因素,但我不确定这是否是您的问题。
library(data.table)
rbindlist(all, use.names = F, idcol = 'id'
)[, .(added = sum(one.1)), by = .(id, color = one)]
id color added
1: 1 red 3
2: 1 blue 1
3: 1 green 0
4: 2 red 1
5: 2 yellow 1
6: 2 green 1
7: 2 blue 1
8: 3 yellow 1
9: 3 green 2
10: 3 white 1
11: 3 blue 0
推荐阅读
- r - 有没有办法在 R 中按多个组聚合?
- python - Python Oracle - 如何使用 2 个 oracle 客户端
- reactjs - 如何处理第二个 onClick 以使用 reactJS 和 redux 发起 API 请求?
- python - Google Api + 使用 python 列出组的成员
- asp.net - LinqDataSource WHERE 查询 - ASP.NET
- android - 从服务器获取 JSON 列表后如何正确更新数据集?
- javascript - 异步流控制,不抛出错误
- php - Using POST to update values through HTML form retrieves old values
- c++ - Qt:如何将不同类的静态信号连接到插槽?
- scheme - 这是一个可用的方案功能吗?