在R语言数据框中将周列数据分组合并为月列并求和
R语言按周列合并为按月列并求和汇总
示例数据构造
先构造一个匹配需求的示例数据框,包含周标识列和多个以日期命名的周数据列:
df <- data.frame( "Calendar year / week" = c("2023-W01", "2023-W02", "2023-W05", "2023-W06"), "2023-01-02" = c(10, 15, NA, NA), "2023-01-09" = c(20, 25, NA, NA), "2023-02-06" = c(NA, NA, 30, 35), "2023-02-13" = c(NA, NA, 40, 45) )
方法一:使用tidyverse工具链(推荐)
借助dplyr、tidyr和lubridate包完成数据转换与聚合:
library(tidyverse) monthly_df <- df %>% # 宽格式转长格式,便于按月份分组处理 pivot_longer(cols = -`Calendar year / week`, names_to = "date", values_to = "value") %>% # 将列名日期转为标准格式,提取年-月作为分组键 mutate(month = format(ymd(date), "%Y-%m")) %>% # 按周标识和月份分组,对数值求和(忽略NA) group_by(`Calendar year / week`, month) %>% summarise(total = sum(value, na.rm = TRUE), .groups = "drop") %>% # 长格式转回宽格式,得到按月划分的结果列 pivot_wider(names_from = month, values_from = total)
运行后输出结果:
# A tibble: 4 × 3 `Calendar year / week` `2023-01` `2023-02` <chr> <dbl> <dbl> 1 2023-W01 30 0 2 2023-W02 40 0 3 2023-W05 0 70 4 2023-W06 0 80
方法二:Base R实现
如果不想加载第三方包,用Base R也能完成需求:
# 提取数值列(排除周标识列) value_cols <- df[, -which(names(df) == "Calendar year / week")] # 将列名转为日期格式,提取年-月作为分组依据 col_months <- format(as.Date(colnames(value_cols)), "%Y-%m") # 对每行数据按月份分组求和 monthly_sums <- t(apply(value_cols, 1, function(x) tapply(x, col_months, sum, na.rm = TRUE))) # 合并原周标识列与求和结果 monthly_df_base <- cbind(df[, "Calendar year / week", drop = FALSE], as.data.frame(monthly_sums))
注意事项
- 若存在跨年度的周(比如12月底的周对应下一年1月的日期),可添加年份校验逻辑,确保分组符合业务需求:
mutate( date = ymd(date), month = format(date, "%Y-%m"), # 从周标识中提取年份 week_year = str_extract(`Calendar year / week`, "^\\d{4}") %>% as.integer(), date_year = year(date) ) %>% filter(week_year == date_year) na.rm = TRUE用于忽略缺失值,若需保留NA可移除该参数。
内容的提问来源于stack exchange,提问作者Mr Pool
相关产品推荐
相关产品推荐

