如何在data.table中按分组用组内首个非重复有效值填充NA值
用data.table分组填充NA为分组内第一个唯一有效值的方法
这里有一个简洁的data.table解决方案,完全匹配你的需求:
library(data.table) # 你的原始数据 k <- data.table(name = rep(letters[1:4], each = 5), year = rep(2015:2019, times = 4), values = c(19, 19, 18, NA, 19, 44, NA, NA, NA, NA, 33, 32, NA, NA, NA, NA, NA, NA, NA, NA)) # 核心填充逻辑 k[, values := ifelse(is.na(values), unique(na.omit(values))[1], values), by = name] # 查看处理后的结果 print(k)
代码解释:
by = name:指定按name列进行分组,确保每个分组独立处理unique(na.omit(values))[1]:na.omit(values):先剔除当前分组中的所有NA值unique(...):提取分组内非NA值的唯一值集合[1]:取这个唯一值集合的第一个元素,作为填充NA的基准值;如果分组内全是NA,这个表达式会返回NA,刚好保持原数据不变
ifelse(is.na(values), ..., values):判断当前values是否为NA,是则用基准值替换,否则保留原数值
运行后得到的结果完全符合你期望的输出:
name year values 1: a 2015 19 2: a 2016 19 3: a 2017 18 4: a 2018 19 5: a 2019 19 6: b 2015 44 7: b 2016 44 8: b 2017 44 9: b 2018 44 10: b 2019 44 11: c 2015 33 12: c 2016 32 13: c 2017 33 14: c 2018 33 15: c 2019 33 16: d 2015 NA 17: d 2016 NA 18: d 2017 NA 19: d 2018 NA 20: d 2019 NA
内容的提问来源于stack exchange,提问作者Shawn Brar
相关产品推荐
相关产品推荐

