You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并含共同列的R语言data.frame并获取指定结果?

合并两个R语言data.frame并处理共同列的解决方案

问题说明

需要合并df_stock和df_flux两个data.frame:

  • 保留所有行(以df_stock的行为基准)
  • 合并所有日期列,共同日期列(如2023-11-01)需用df_flux的值覆盖df_stock对应行的值
  • 缺失值用NA填充,最终得到指定的expected_result

原始数据

数据定义代码

df_stock <- data.frame(
  CODE_S = c("57210390", "33210390"),
  `2023-04-01` = c(1.1, 1.5),
  `2023-11-01` = c(3.1, 4.2),
  check.names = FALSE)

df_flux <- data.frame(
  CODE_S = c("57210390"), 
  `2023-10-01` = c(1.25), 
  `2023-11-01` = c(1.31),
  check.names = FALSE)

expected_result <- data.frame(
  CODE_S = c("57210390", "33210390"),
  `2023-04-01` = c(1.1, 1.5),
  `2023-10-01` = c(1.25,NA),
  `2023-11-01` = c(1.31, 4.2),
  check.names = FALSE)

数据展示

> df_stock
    CODE_S 2023-04-01 2023-11-01
1 57210390        1.1        3.1
2 33210390        1.5        4.2

> df_flux
    CODE_S 2023-10-01 2023-11-01
1 57210390       1.25       1.31

> expected_result
    CODE_S 2023-04-01 2023-10-01 2023-11-01
1 57210390        1.1       1.25       1.31
2 33210390        1.5         NA       4.20

解决方案

方法1:使用dplyr包(推荐)

通过left_join合并数据,结合coalesce优先取df_flux的值覆盖共同列:

library(dplyr)

# 按CODE_S合并,保留df_stock所有行
merged_df <- left_join(df_stock, df_flux, by = "CODE_S")

# 处理共同日期列:优先用df_flux的数值,否则保留df_stock的数值
common_date_cols <- setdiff(intersect(names(df_stock), names(df_flux)), "CODE_S")
for(col in common_date_cols) {
  merged_df[[col]] <- coalesce(merged_df[[paste0(col, ".y")]], merged_df[[paste0(col, ".x")]])
  merged_df <- merged_df %>% select(-all_of(paste0(col, c(".x", ".y"))))
}

# 调整列顺序与预期结果一致
merged_df <- merged_df %>% select(CODE_S, sort(names(merged_df)[-1]))

# 查看结果
merged_df

方法2:基础R实现

无需额外包,手动合并并处理共同列:

# 合并数据,保留df_stock所有行
merged_df <- merge(df_stock, df_flux, by = "CODE_S", all.x = TRUE)

# 处理共同日期列
common_date_cols <- setdiff(intersect(names(df_stock), names(df_flux)), "CODE_S")
for(col in common_date_cols) {
  merged_df[[col]] <- ifelse(!is.na(merged_df[[paste0(col, ".y")]]), 
                             merged_df[[paste0(col, ".y")]], 
                             merged_df[[paste0(col, ".x")]])
  merged_df <- merged_df[, !names(merged_df) %in% paste0(col, c(".x", ".y"))]
}

# 调整列顺序
col_order <- c("CODE_S", sort(setdiff(names(merged_df), "CODE_S")))
merged_df <- merged_df[, col_order]

# 查看结果
merged_df

两种方法运行后均可得到与expected_result完全一致的输出。


内容的提问来源于stack exchange,提问作者Damien Dotta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:10:18