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

如何合并两个经mutate处理的DataFrame并保留原结构?

合并两个处理后DataFrame的方法

问题背景

我从单个DataFrame original_data生成了两个经mutate处理的DataFrame:

  • 对original_data使用mutate函数,仅保留≤600秒的值,其余设为NA,结果存为new_data_one;
  • 再次对original_data使用mutate函数,仅保留>600的单个值,其余设为NA,结果存为new_data_two。

两个DataFrame结构与原数据一致,示例如下:

原数据 original_data

1  2   3   4   5
R1 80 98 150 599 650
R2 90 95 254 725 905
R3 93 96 540 650 780

处理后数据 new_data_one

1  2   3   4   5
R1 80 98 150 599 NA
R2 90 95 254 NA  NA
R3 93 96 540 NA  NA

处理后数据 new_data_two

1  2   3  4  5
R1 NA NA NA NA  650
R2 NA NA NA 725  NA
R3 NA NA NA 650  NA

需要将new_data_one和new_data_two合并,得到如下目标DataFrame:

目标数据 desired_merged_dataframe

1  2   3   4   5
R1 80 98 150 599 650
R2 90 95 254 725 NA
R3 93 96 540 650 NA

解决方案

方法1:用dplyr的coalesce函数(推荐)

因为两个DataFrame的行列完全对齐,每个单元格位置上要么new_data_one有值(≤600),要么new_data_two有值(>600),要么都为NA。coalesce函数可以逐元素取第一个非NA值,完美适配这个场景:

先加载dplyr和purrr包,然后对每一列应用coalesce:

library(dplyr)
library(purrr)

desired_merged_dataframe <- map2_dfc(new_data_one, new_data_two, coalesce)
# 恢复行名(如果需要)
rownames(desired_merged_dataframe) <- rownames(new_data_one)

方法2:基础R实现(无需额外包)

如果不想加载第三方包,可以直接用向量化的ifelse操作:

# 复制new_data_one作为基础
desired_merged_dataframe <- new_data_one
# 遍历每一列,把new_data_one中的NA替换成new_data_two对应位置的值
for (col in colnames(desired_merged_dataframe)) {
  desired_merged_dataframe[[col]] <- ifelse(is.na(desired_merged_dataframe[[col]]), 
                                            new_data_two[[col]], 
                                            desired_merged_dataframe[[col]])
}

或者更简洁的向量化写法:

desired_merged_dataframe <- as.data.frame(ifelse(is.na(new_data_one), new_data_two, new_data_one))
# 恢复行名
rownames(desired_merged_dataframe) <- rownames(new_data_one)

运行任意一种方法后,都能得到目标结构的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:35:18