R:汇总行以将月度数据转换为季度数据
R: aggregate rows to transform monthly into quarterly data
我有一个每月观察的数据框。每行代表一个月。
我需要将其转换为包含季度观察的数据框。换句话说,我需要汇总第 1-3 个月形成 Q1,第 4-6 个月形成第 2 季度,等等
survey1 <- data.frame("col1" = c(10, 10, 10, 20, 20, 20),
"col2" = c(10, 15, 12, 30, 33, 35),
"col3" = c(12, 12, 12, 22, 22, 22))
它变得更加棘手,因为我想聚合具有不同操作的列。
第 1 列和第 3 列在每个季度都是不变的:它们在第 1 个月、第 2 个月和第 3 个月具有相同的值。
另一方面,第 2 列确实记录了每个月的不同值。我想总结第 2 列中每个季度对新数据框的观察的所有值。
换句话说,我想从上面的 survey1 到下面的 survey2。
survey2 <- data.frame("col1" = c(10, 20),
"col2" = c(37, 98),
"col3" = c(12, 22))
谢谢
您可以将每 3 行分成四分之一,并计算每个变量的汇总统计量。由于 col1
和 col3
在每个季度都有相同的值,我们可以 select 这些列中的任何值,我 select 编辑了第一个。
library(dplyr)
survey1 %>%
group_by(Quarter = paste0('Q', ceiling(row_number()/3))) %>%
summarise(across(c(col1, col3), first),
col2 = sum(col2)) %>%
select(Quarter, col1, col2, col3)
# Quarter col1 col2 col3
# <chr> <dbl> <dbl> <dbl>
#1 Q1 10 37 12
#2 Q2 20 98 22
也可以使用 col1
和 col3
作为分组变量,因为我们知道它们每个季度都相同。如果每个季度的 col1
和 col3
组合具有不同的值,这将起作用。
survey1 %>%
group_by(col1, col3) %>%
summarise(col2 = sum(col2), .groups = 'drop')
我提供了替代解决方案
- 创建一个模拟月份的列(按数据行动态扩展)
- 然后创建季度列
- group_by 季度
- 对于 cols1&3 取最小值,因为它不会改变
- 对于 cols2 求和
survey1 %>%
mutate(months=1:dim(survey1)[1],
quarter=lubridate::quarter(months)) %>%
group_by(quarter) %>%
summarize(col1_min=min(col1),
col2_sum=sum(col2),
col3_min=min(col3))
我有一个每月观察的数据框。每行代表一个月。 我需要将其转换为包含季度观察的数据框。换句话说,我需要汇总第 1-3 个月形成 Q1,第 4-6 个月形成第 2 季度,等等
survey1 <- data.frame("col1" = c(10, 10, 10, 20, 20, 20),
"col2" = c(10, 15, 12, 30, 33, 35),
"col3" = c(12, 12, 12, 22, 22, 22))
它变得更加棘手,因为我想聚合具有不同操作的列。
第 1 列和第 3 列在每个季度都是不变的:它们在第 1 个月、第 2 个月和第 3 个月具有相同的值。
另一方面,第 2 列确实记录了每个月的不同值。我想总结第 2 列中每个季度对新数据框的观察的所有值。
换句话说,我想从上面的 survey1 到下面的 survey2。
survey2 <- data.frame("col1" = c(10, 20),
"col2" = c(37, 98),
"col3" = c(12, 22))
谢谢
您可以将每 3 行分成四分之一,并计算每个变量的汇总统计量。由于 col1
和 col3
在每个季度都有相同的值,我们可以 select 这些列中的任何值,我 select 编辑了第一个。
library(dplyr)
survey1 %>%
group_by(Quarter = paste0('Q', ceiling(row_number()/3))) %>%
summarise(across(c(col1, col3), first),
col2 = sum(col2)) %>%
select(Quarter, col1, col2, col3)
# Quarter col1 col2 col3
# <chr> <dbl> <dbl> <dbl>
#1 Q1 10 37 12
#2 Q2 20 98 22
也可以使用 col1
和 col3
作为分组变量,因为我们知道它们每个季度都相同。如果每个季度的 col1
和 col3
组合具有不同的值,这将起作用。
survey1 %>%
group_by(col1, col3) %>%
summarise(col2 = sum(col2), .groups = 'drop')
我提供了替代解决方案
- 创建一个模拟月份的列(按数据行动态扩展)
- 然后创建季度列
- group_by 季度
- 对于 cols1&3 取最小值,因为它不会改变
- 对于 cols2 求和
survey1 %>%
mutate(months=1:dim(survey1)[1],
quarter=lubridate::quarter(months)) %>%
group_by(quarter) %>%
summarize(col1_min=min(col1),
col2_sum=sum(col2),
col3_min=min(col3))