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

如何根据行名将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:37