如何合并两个经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
相关产品推荐
相关产品推荐

