如何在data.table中按条件高效替换缺失的description值?
在data.table中高效替换缺失描述值的方案
核心逻辑
按id分组,将空字符串的description替换为当前id下日期最新的非空description;若当前id无任何非空description,则保留空值。
示例数据转换
先将你提供的data.frame转为data.table:
library(data.table) set.seed(3) dt <- as.data.table( data.frame( seqs = 1:11 , id = c(1,1,1,2,3,3,4,4,4,4,5) , description = c("Red","Red","","","Blue","Blue","Red","Red","","Red","Blue"), dates = sample(2000:2020, 11, TRUE) ) )
高效替换代码
直接通过data.table分组操作完成替换,无需额外映射表,内存效率适配百万级数据:
dt[, { # 获取当前id下最新的非空描述值,无则为空字符串 latest_desc <- if (any(description != "")) { .SD[description != "", .SD[which.max(dates)]$description] } else { "" } # 替换空描述 description := fifelse(description == "", latest_desc, description) }, by = id]
结果验证
seqs=3(id=1):替换为同id下最新非空的"Red"seqs=4(id=2):因同id无其他非空值,保留空字符串seqs=9(id=4):替换为同id下最新非空的"Red"
性能说明
该方案完全基于data.table的原生分组机制,避免了不必要的数据复制或转换,内存占用低,处理百万级数据集时效率远高于循环或非data.table方法。
内容的提问来源于stack exchange,提问作者MatthewR
相关产品推荐
相关产品推荐

