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

基于公共列合并两个DataFrame,仅保留A的列,缺失值填充为NA

问题描述

我有两个存在公共列的DataFrame,结构如下所示:

DataFrame A

structure(list(Firm = c("Alex", NA, NA), Postal.Code = c("V0N 1B4", 
"V0N 1B4", "V0N 1B4"), sold.month = c(NA_real_, NA_real_, NA_real_
), sold.year = c(NA_real_, NA_real_, NA_real_), sold.qtr = c(NA_real_, 
NA_real_, NA_real_), List.year = c(2018, 2018, 2018), List.Date.Year.quarter = c("2018 Q2", 
"2018 Q2", "2018 Q2")), row.names = c(NA, 3L), class = "data.frame")

打印结果:

Firm Postal.Code sold.month sold.year sold.qtr List.year List.Date.Year.quarter
1 Alex     V0N 1B4         NA        NA       NA      2018                2018 Q2
2 <NA>     V0N 1B4         NA        NA       NA      2018                2018 Q2
3 <NA>     V0N 1B4         NA        NA       NA      2018                2018 Q2

DataFrame B

structure(list(sold.month = c(NA, 1L, 1L), sold.year = c(NA, 
2020L, 2020L), sold.qtr = c(NA, 1L, 1L), List.Date.Year.quarter = structure(c(2019.75, 
2019.75, 2019.75), class = "yearqtr"), List.Date.Year.month = structure(c(2019.75, 
2019.91666666667, 2019.91666666667), class = "yearmon"), Sold.Date.Year.month = structure(c(NA, 
2020, 2020), class = "yearmon")), row.names = c(NA, 3L), class = "data.frame")

打印结果:

sold.month sold.year sold.qtr List.Date.Year.quarter List.Date.Year.month Sold.Date.Year.month
1         NA        NA       NA                2019 Q4             Oct 2019                 <NA>
2          1      2020        1                2019 Q4             Dec 2019             Jan 2020
3          1      2020        1                2019 Q4             Dec 2019             Jan 2020

需求

仅合并DataFrame B中在DataFrame A里存在的列,若DataFrame A的列在B中不存在,对应值显示为NA。

预期输出

Firm Postal.Code sold.month sold.year sold.qtr List.year List.Date.Year.quarter
1 Alex     V0N 1B4         NA        NA       NA      2018                2018 Q2
2 <NA>     V0N 1B4         NA        NA       NA      2018                2018 Q2
3 <NA>     V0N 1B4         NA        NA       NA      2018                2018 Q2
4  NA         NA           NA        NA       NA       NA                 2019 Q4
5  NA         NA            1       2020       1       NA                 2019 Q4
6  NA         NA            1       2020       1       NA                 2019 Q4
解决方案

核心逻辑是先对齐两个表的列结构再按行拼接,步骤如下:

  1. 先统一公共列的类型,避免拼接时报错:DataFrame A的List.Date.Year.quarter是字符串类型,DataFrame B的对应列是yearqtr类型,先转成一致的字符串格式
  2. 提取DataFrame A的所有列名作为最终输出的列顺序标准
  3. 给DataFrame B补充A有但B没有的列,赋值为NA,同时删掉B中A不存在的列
  4. 按A的列顺序重排B的列后,直接拼接两个表即可

示例代码:

# 加载zoo包处理yearqtr类型转换,如已加载可跳过
library(zoo)

# 统一公共列类型
df_b$List.Date.Year.quarter <- as.character(df_b$List.Date.Year.quarter)

# 提取A的列名作为标准
cols_a <- colnames(df_a)

# 处理B的列:保留和A共有的列,补充A有B无的列赋值为NA
df_b_processed <- df_b[, intersect(cols_a, colnames(df_b)), drop = FALSE]
df_b_processed[setdiff(cols_a, colnames(df_b))] <- NA

# 按A的列顺序重排B的列
df_b_processed <- df_b_processed[, cols_a, drop = FALSE]

# 拼接得到最终结果
result <- rbind(df_a, df_b_processed)

运行后得到的result即为符合要求的输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:51:01