【问题标题】:combine/merge rows with dplyr使用 dplyr 合并/合并行
【发布时间】:2025-12-03 06:55:02
【问题描述】:

看起来像的数据

Month    Location    Money
1          Miami      12
1          Cal        15
2          Miami       5
2          Cal         3
...
12         Miami       6
12         Cal          8

我想改造它,让它看起来像

Month     Location      Money
Spring      Miami        sum(from month=1,2,3)
spring      Cal          sum (from month= 1,2,3)
summer...
summer...
fall...
fall...
winter...
winter...

我不知道如何直接提出问题(合并行,聚合行?),但谷歌搜索它只返回 dplyr::group_by 并根据行的单个值汇总哪些行折叠。 我想根据多行值合并/汇总数据。 有没有简单的方法?任何帮助将不胜感激谢谢!

【问题讨论】:

  • 你能分享所有月份的数据以及你想分配给夏季、秋季、冬季等的月份吗?
  • 春天是月份 = 1,2,3 / 夏天是月份 = 4,5,6...等。我发布的问题似乎很难理解。我的目标是整理包含三列的数据 - 1. 月 (1, 2, ... 11, 12, 1, 2, ... 11, 12) 和 2. 位置 (迈阿密, Cal,加利福尼亚州迈阿密......每次重复 12 次)和 3. 钱(任何数字)
  • 您可以使用 dput() 函数发布您的全部数据吗?在我们结束时重新创建您的数据框将很容易。
  • 我想按月份和位置汇总数据,但不是 dplyr::summarize 的方式,它将月份中的每个值与位置中的每个值配对,创建 24 行。相反,我想将每个位置与季节(上面列出)配对,总共创建 8 行。
  • 您能否分享一些示例(或模拟)数据,以便我们了解您正在使用什么以及您正在尝试做什么。

标签: r dplyr rows


【解决方案1】:

听起来你想要

  1. 为每条记录分配季节,
  2. group_by 季节,
  3. 总结一下。

如果这是您要去的地方,您可以创建一个新列,也可以直接创建。您还可以创建一个单独的表,其中包含月份和季节以及 left_join 到您的数据。

library(dplyr)
## simulate data
df = tibble(
      month = rep(1:12, each = 4),
      location = rep(c("Cal", "Miami"), times = 24),
      money = as.integer(runif(48, 10, 100 ))
)

head(df)
# # A tibble: 6 x 3
# month location money
# <int> <chr>    <int>
# 1     1 Cal         69
# 2     1 Miami       84
# 3     1 Cal         38
# 4     1 Miami       44
# 5     2 Cal         33
# 6     2 Miami       64

## Create season based on month in groups of 3
df %>%
      mutate(season = (month-1) %/% 3 +1) %>%
      group_by(season, location) %>%
      summarize(Monthly_Total = sum(money))
# # A tibble: 8 x 3
# # Groups:   season [4]
# season location Monthly_Total
# <dbl> <chr>            <int>
# 1      1 Cal                360
# 2      1 Miami              265
# 3      2 Cal                392
# 4      2 Miami              380
# 5      3 Cal                348
# 6      3 Miami              278
# 7      4 Cal                358
# 8      4 Miami              411

使用相同的数据,您可以跳过列创建并将其包含在 group_by 中:


df %>%
      group_by(season = (month-1) %/% 3 +1, location) %>%
      summarize(Monthly_Total = sum(money))
## results identical to above.

只创建一个季节表可能更有意义:

seasons = tibble(
      month = 1:12,
      season = rep(c("Spring", "Summer", "Winter", "Fall"), each = 3)
)

df %>%
      left_join(seasons) %>%
      group_by(season, location) %>%
      summarize(Monthly_Total = sum(money))
## again identical to above

后者的优点是更透明。

【讨论】:

  • 真正的救生员!!非常感谢
【解决方案2】:

您可以在转换 Month 变量后进行聚合:

aggregate(Money ~ Month + Location, transform(data, Month = (Month - 1) %/% 3), sum)

【讨论】: