如何在R data.table中仅向前填充非NA值后的前两个NA?
解决方法
可以通过以下步骤在data.table中实现仅填充每个非NA值后前两个NA的需求:
- 创建分组标识:用
cumsum(!is.na(x))为每个非NA值及其后续的NA创建独立分组,每个非NA值会开启一个新分组。 - 计算组内位置:在每个分组内生成位置序号,标记每个元素相对于分组起始非NA值的位置。
- 条件填充:仅对分组内位置为2和3的NA值(即非NA值后的前两个NA),用分组的第一个元素(即起始非NA值)填充,其余元素保持不变。
完整代码示例
library(data.table) # 创建原始data.table dt <- data.table(x = c(58, NA, NA, NA, NA, 13, NA, NA, NA, 12, 23, NA, 12)) # 一步完成分组、位置计算和条件填充 dt[, filled := ifelse(is.na(x) & seq_len(.N) <= 3, x[1], x), by = cumsum(!is.na(x))] # 查看结果 dt$filled # 输出: [1] 58 58 58 NA NA 13 13 13 NA 12 23 23 12
代码解释
cumsum(!is.na(x)):每次遇到非NA值时累加计数,生成唯一的分组ID,确保每个非NA值和后续NA属于同一分组。seq_len(.N):在每个分组内生成从1开始的连续序号,标记元素在分组内的位置。ifelse(is.na(x) & seq_len(.N) <=3, x[1], x):仅当元素是NA且在分组内位置≤3时(即非NA后的前两个NA),用分组的第一个非NA值填充;其他元素保持原值。
内容的提问来源于stack exchange,提问作者sol
相关产品推荐
相关产品推荐

