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

合并DataFrame后添加列标识数据来源的R语言实现方法

在R中全量合并DataFrame并标记数据来源

这里提供几种实用的实现方式,帮你完成全量合并并新增来源标记列的需求:

方法一:基础R原生实现

先完成全量合并,再根据合并后列的缺失情况判断数据来源:

set.seed(1)
df1 <- data.frame(id = 1:10, cat = rpois(10, 1))
df2 <- data.frame(id = 8:13, dog = rpois(6, 1))

# 按id执行全量合并
merged_df <- merge(df1, df2, all = TRUE, by = "id")

# 新增which列标记数据来源
merged_df$which <- with(merged_df, 
                        ifelse(!is.na(cat) & is.na(dog), "df1",
                               ifelse(is.na(cat) & !is.na(dog), "df2", "both")))

运行后得到的结果与你期望的完全一致:

print(merged_df)
#    id cat dog which
# 1   1   0  NA   df1
# 2   2   1  NA   df1
# 3   3   1  NA   df1
# 4   4   2  NA   df1
# 5   5   0  NA   df1
# 6   6   2  NA   df1
# 7   7   3  NA   df1
# 8   8   1   0  both
# 9   9   1   0  both
# 10 10   0   1  both
# 11 11  NA   1   df2
# 12 12  NA   2   df2
# 13 13  NA   1   df2

方法二:用dplyr实现(逻辑更清晰)

如果习惯使用tidyverse系列工具,dplyr的case_when能让判断逻辑更直观:

library(dplyr)

set.seed(1)
df1 <- data.frame(id = 1:10, cat = rpois(10, 1))
df2 <- data.frame(id = 8:13, dog = rpois(6, 1))

merged_df <- full_join(df1, df2, by = "id") %>%
  mutate(which = case_when(
    !is.na(cat) & is.na(dog) ~ "df1",
    is.na(cat) & !is.na(dog) ~ "df2",
    TRUE ~ "both"
  ))

方法三:先标记来源再合并(适配复杂场景)

如果原DataFrame的列本身可能存在缺失值,前两种方法会出错。这时可以先给每个数据集添加专属标记,再合并判断:

library(dplyr)

set.seed(1)
df1 <- data.frame(id = 1:10, cat = rpois(10, 1)) %>% mutate(source = "df1")
df2 <- data.frame(id = 8:13, dog = rpois(6, 1)) %>% mutate(source = "df2")

merged_df <- full_join(df1, df2, by = "id") %>%
  mutate(which = case_when(
    !is.na(source.x) & is.na(source.y) ~ "df1",
    is.na(source.x) & !is.na(source.y) ~ "df2",
    TRUE ~ "both"
  )) %>%
  select(-source.x, -source.y) # 移除临时标记列

这种方法不受原数据列缺失的影响,适用性更强。

内容的提问来源于stack exchange,提问作者Maël

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:27