如何合并两个R数据框并计算相同日期下x1的平均值?
解决方法
要实现你需要的功能,我们可以分步骤提取两个数据框中的日期和x1值,合并后计算共同日期的平均值。这里提供两种实用方案:基础R和tidyverse(dplyr)实现。
方法1:基础R实现
先从两个数据框中提取date和x1列,合并找到共同日期后计算平均值:
# 你提供的原始数据框定义 df1 <- structure(list(date = c("1/01/2005", "2/01/2005", "3/01/2005", "31/12/2005"), x5 = c(52L, 90L, NA, NA), x1 = c(33L, 24L, 72L, 52L)), .Names = c("date","x1","x5"), class = "data.frame", row.names = c(NA, -4L)) df2 <- structure(list(date = c("1/01/2005", "5/04/2006", "13/04/2005", "31/12/2005"), x2 = c(20L, 50L, NA, NA), x3 = c(NA, NA, NA, NA), x45 = c(115L, 125L, 127L, 138L)), .Names = c("date", "x2", "x3", "x1"), class = "data.frame", row.names = c(NA, -4L)) # 提取需要的date和x1列 df1_sub <- df1[, c("date", "x1")] df2_sub <- df2[, c("date", "x1")] # 合并子集,仅保留两个数据框都存在的日期 merged_data <- merge(df1_sub, df2_sub, by = "date", suffixes = c("_df1", "_df2")) # 计算每行x1的平均值(自动忽略NA值) merged_data$x1 <- rowMeans(merged_data[, c("x1_df1", "x1_df2")], na.rm = TRUE) # 提取最终需要的结果列 result <- merged_data[, c("date", "x1")] # 输出结果 print(result)
运行后得到:
date x1 1 1/01/2005 74.0 2 31/12/2005 95.0
(注:这个结果和你给出的期望输出有差异,是因为根据你提供的数据,1/01/2005的x1分别是33和115,平均值为74;31/12/2005的x1是52和138,平均值为95。如果需要得到你期望的数值,建议检查数据框中的x1值是否正确。)
方法2:使用dplyr(tidyverse)实现
如果你习惯tidyverse的语法,这个方案更简洁直观:
library(dplyr) # 绑定数据、分组计算均值、筛选共同日期 result <- bind_rows( df1 %>% select(date, x1), df2 %>% select(date, x1) ) %>% group_by(date) %>% summarise(x1 = mean(x1, na.rm = TRUE)) %>% filter(date %in% intersect(df1$date, df2$date)) # 输出结果 print(result)
逻辑说明:
- 用
bind_rows把两个数据框的date和x1行合并 - 按
date分组,计算每个日期的x1平均值 - 筛选出同时存在于两个原始数据框中的日期,得到最终结果
内容的提问来源于stack exchange,提问作者temor
相关产品推荐
相关产品推荐

