如何在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
相关产品推荐
相关产品推荐

