如何在R中按日期分组聚合dataframe列值 实现单日一行的数据集结构
R语言按日期分组聚合数值列求和方案
你可以根据自己的使用习惯选择以下任意一种实现方式:
- dplyr包实现(最常用,易读性高)
首先确保已安装dplyr包,执行以下代码:
# 安装包(仅首次使用需要执行) install.packages("dplyr") # 加载包 library(dplyr) df_agg <- df %>% # 按日期及同日期取值唯一的非数值列分组 group_by(date1, Id, Week, DTPE) %>% # 对所有数值列做求和聚合 summarise(across(where(is.numeric), sum), .groups = "drop")
- 基础R实现(无需安装额外依赖包)
df_agg <- do.call(rbind, lapply(split(df, df$date1), function(sub_df){ # 非数值列取该分组第一行值(同日期下值一致) non_num_cols <- sub_df[1, !sapply(sub_df, is.numeric), drop = FALSE] # 数值列按列求和 num_cols_sum <- t(colSums(sub_df[, sapply(sub_df, is.numeric), drop = FALSE])) # 合并两部分结果 cbind(non_num_cols, as.data.frame(num_cols_sum)) })) # 重置行号 rownames(df_agg) <- NULL
- data.table包实现(适合处理超大数据量,性能更高)
# 安装包(仅首次使用需要执行) install.packages("data.table") # 加载包 library(data.table) # 转换为data.table格式 setDT(df) # 分组聚合 df_agg <- df[, lapply(.SD, function(col) { if(is.numeric(col)) sum(col) else col[1] }), by = .(date1, Id, Week, DTPE)]
结果验证
你可以直接查看聚合后的结果,以2021-07-01为例,聚合后该行数值列均为原4行数据的求和值:
> df_agg[df_agg$date1 == "2021-07-01", ] date1 Id Week DTPE D1 DR01 DR02 DR03 DR04 DR05 7 2021-07-01 1 Thursday Ho 21 12 16 19 22 21
如果你的实际数据中同日期下Week/DTPE存在不同取值,只需调整分组字段,仅保留date1作为分组依据,非数值列可根据需求调整取值逻辑(比如取众数、取第一个有效值等)。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

