R语言如何基于另一列分组批量填充dataframe目标列缺失值
按分组列填充另一列NA值的实现方案
场景说明
现有数据框结构示例如下,需要按input列的唯一值分组,将同组内n1列的NA值替换为该组下已存在的非空值,不使用硬编码指定分组取值,适配大体量数据处理需求。
初始测试数据:
df <- data.frame(input = c("Teline stenopetala", "Teline stenopetala", "Teline stenopetala", "Prunus lusitanica", "Prunus lusitanica"), n1 = c("Genista stenopetala Webb & Berthel.", NA, NA, NA, "Prunus hixa Brouss ex. Willd."))
期望输出为同组所有n1值统一为该组对应的非空取值。
实现代码
1. tidyverse 写法(易读易维护,适配常规数据量)
通过dplyr分组后直接取组内第一个非空值覆盖整组,无需手动指定任何分组规则:
library(dplyr) df <- df %>% group_by(input) %>% mutate(n1 = first(na.omit(n1))) %>% ungroup()
2. data.table 写法(性能优异,适配百万级以上大数据量)
大数据量场景下优先选择该写法,运行效率远高于常规tidyverse写法:
library(data.table) setDT(df) df[, n1 := na.omit(n1)[1], by = input]
注意事项
- 上述代码默认每个
input分组下n1列仅存在1种唯一非空取值,和示例场景完全匹配 - 如果同组存在多个不同的非空
n1值,代码默认取组内第一个出现的非空值填充,可根据实际业务需求调整组内取值逻辑
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

