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

如何在R中依据Name列匹配填充合并后数据框的ID列?

解决方案:按Name填充合并后数据框的ID列

问题分析

合并df1和df2后,新增行的ID列显示为NA,需要根据Name匹配填充对应ID值。此前用ifelse、mapvalues报错是因为未按Name分组处理,全局匹配导致向量长度不匹配。

数据准备

# 创建示例数据框
df1 <- data.frame(
  Name = c("A", "B", "B", "B", "C", "C"),
  ID = c(111, 222, 222, 222, 333, 333),
  time = c(2000, 2001, 2002, 2003, 2002, 2005),
  Month = c(3, 5, 7, 3, 9, 4),
  stringsAsFactors = FALSE
)

df2 <- data.frame(
  Name = c("A", "B", "C"),
  time = c(2007, 2002, 2000),
  stringsAsFactors = FALSE
)

方案一:dplyr + tidyr 实现(简洁易读)

library(dplyr)
library(tidyr)

# 合并数据框
combined_df <- bind_rows(df1, df2)

# 按Name分组,填充NA的ID值
combined_df_filled <- combined_df %>%
  group_by(Name) %>%
  mutate(ID = replace_na(ID, first(ID))) %>%
  ungroup()

# 输出结果
print(combined_df_filled)

逻辑说明:按Name分组后,每个组内的ID值唯一,直接用每组第一个非NA的ID替换组内所有NA,避免全局匹配的长度问题。

方案二:data.table 实现(高效适用于大数据)

library(data.table)

# 转换为data.table格式
setDT(df1)
setDT(df2)

# 合并并填充ID
combined_dt <- rbindlist(list(df1, df2), fill = TRUE)
combined_dt[, ID := nafill(ID, type = "locf"), by = Name]

# 输出结果
print(combined_dt)

逻辑说明:rbindlist替代rbind.fill实现快速合并,按Name分组后用nafill的locf(向前填充)规则,自动将组内NA替换为前一个非NA的ID值(因每组ID一致,效果等同于填充对应Name的ID)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:01:17