如何在RStudio中依据另一数据表填充数据框的NA值?
用R根据匹配关系填充数据框中的NA值
首先还原你的两个数据集(可直接运行的R代码):
df <- data.frame( a = c(1,1,1,1,2,2,2,3,3,3,3), b = c("A", NA, "A", NA, "C", NA, "B", "A", NA, "C", "D"), stringsAsFactors = FALSE ) fill_with <- data.frame( a = c(1,2,3), b = c("A", "B", "C"), stringsAsFactors = FALSE )
需求:根据a列的匹配关系,用fill_with中对应a的b值,填充df里b列的NA值。
方法1:使用dplyr(tidyverse生态)
这是常用的tidy风格实现,步骤清晰易读:
library(dplyr) df_filled <- df %>% # 按a列合并数据集,将fill_with的b值命名为b_fill作为辅助列 left_join(fill_with, by = "a", suffix = c("", "_fill")) %>% # 用coalesce取第一个非NA值,替换原b列的NA mutate(b = coalesce(b, b_fill)) %>% # 移除辅助列 select(-b_fill) # 查看填充结果 print(df_filled)
方法2:使用base R(无需额外安装包)
如果不想加载第三方包,可通过基础R实现:
# 将fill_with转换为命名向量:以a的值为名称,对应b的值为向量元素 fill_vector <- setNames(fill_with$b, fill_with$a) # 定位df中b列的NA位置,用匹配的a值从fill_vector中取对应值替换 df$b[is.na(df$b)] <- fill_vector[as.character(df$a[is.na(df$b)])] # 查看填充结果 print(df)
两种方法都能得到你需要的填充结果:
a b 1 1 A 2 1 A 3 1 A 4 1 A 5 2 C 6 2 B 7 2 B 8 3 A 9 3 C 10 3 C 11 3 D
内容的提问来源于stack exchange,提问作者Csaba Daniel Farkaš
相关产品推荐
相关产品推荐

