R语言如何合并同一列中Id对应的相同日期数据行
问题原因
- 你使用dplyr代码仅返回一行汇总结果,核心是包冲突导致:同时加载
plyr和dplyr包时,如果plyr加载顺序在后,会覆盖dplyr的summarize()函数,使得分组逻辑失效,直接返回全局聚合结果。 - 第二种aggregate方法不符合需求的原因是仅按
Id单维度分组,没有同时按Id+日期双维度分组,自然每个Id仅返回一条结果,丢失多日期数据。
解决方案
dplyr实现(推荐)
library(dplyr) # 1. 先处理原始数据 final_df <- notimesw %>% ungroup() %>% # 清除原始数据自带的分组规则,避免干扰 mutate(date = as.Date(date)) %>% # 统一日期格式,避免字符串格式差异导致分组错误 group_by(Id, date) %>% # 按Id+日期双维度分组,仅合并同Id同日期的行 dplyr::summarise( WeightPounds = mean(WeightPounds, na.rm = TRUE), TotalSleepRecords = mean(TotalSleepRecords, na.rm = TRUE), TotalMinutesAsleep = mean(TotalMinutesAsleep, na.rm = TRUE), .groups = "drop" # 汇总后自动取消分组,避免后续操作异常 ) %>% # 把全NA分组返回的NaN替换为NA,符合常规使用习惯 mutate(across(where(is.numeric), ~ifelse(is.nan(.), NA, .)))
注:代码中加dplyr::前缀指定调用dplyr的summarise函数,彻底避免包冲突问题
Base R aggregate实现
# 先统一日期格式 notimesw$date <- as.Date(notimesw$date) final_df_agg <- aggregate( . ~ Id + date, data = notimesw, FUN = function(x) mean(x, na.rm = TRUE), na.action = na.pass # 保留所有分组,避免某列全为NA的分组被丢弃 ) # 替换NaN为NA final_df_agg[sapply(final_df_agg, is.nan)] <- NA
两种方法执行后,都会保留所有Id+日期的唯一组合,仅合并同一Id同一日期下的多条数据,完全符合需求。
内容的提问来源于stack exchange,提问作者arobbie jammer
相关产品推荐
相关产品推荐

