如何根据行名将df2的Age值填充至df1的对应NA位置?
问题分析与解决方法
你的循环代码失效的核心原因:按索引位置匹配行名完全不靠谱。df1和df2的行顺序不一样,只有极少数行的索引i会对应相同的行名(比如Patient_1在两个表的第1位),像Patient_10在df1是第4行,在df2是第2行,循环里的i根本匹配不上,自然填充不全。
下面是几种高效的正确实现方式:
方法1:基础R直接赋值(最简单)
利用行名精准定位需要填充的行,一次性完成替换:
# 直接通过行名匹配,把df2的Age值赋值给df1对应行 df1[rownames(df2), "Age"] <- df2[rownames(df2), "Age"]
因为题目明确说df2的行名全部存在于df1中,所以这个方法安全且高效,不需要循环。
方法2:针对df1中NA行的精准填充(更严谨)
如果需要确保只替换df1中原本为NA的行(避免误改已有有效值),可以先筛选出这些行的行名再赋值:
# 找出df1中Age列是NA的行名 na_row_names <- rownames(df1)[is.na(df1$Age)] # 用df2对应行的Age值填充 df1[na_row_names, "Age"] <- df2[na_row_names, "Age"]
方法3:tidyverse风格实现(适合习惯dplyr的用户)
把行名转成普通列进行匹配,处理后再转回去:
library(dplyr) library(tibble) df1 <- df1 %>% # 把行名转为ID列 rownames_to_column("ID") %>% # 左连接df2的数据(同样先转行名为ID) left_join(df2 %>% rownames_to_column("ID"), by = "ID", suffix = c("", "_fill")) %>% # 用df2的Age填充df1的NA值 mutate(Age = ifelse(is.na(Age), Age_fill, Age)) %>% # 移除连接带来的重复列 select(-Age_fill, -Gender_fill) %>% # 把ID列转回行名 column_to_rownames("ID")
填充后的df1结果会是:
Age Gender Patient_1 59 Male Patient_3 30 Male Patient_66 45 Female Patient_10 80 Female Patient_11 67 Female Patient_23 21 Male
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

