You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R的data.table中计算连续非NA值的均值并新增列

解决方法

要实现给data.table新增value_new列,填入连续非NA值的均值,可通过分组计算实现,具体步骤如下:

1. 原数据加载

library(data.table)

test = data.table(date = c("2006-01-31", "2006-03-20", "2006-03-28", "2006-05-03", "2006-05-04", "2006-06-29", "2006-09-11"), 
                  value = c(NA, -0.028, NA, 0.0245, -0.008, NA, -0.009))

2. 核心实现代码

方法一:用data.table内置函数分组

# 生成连续非NA序列的分组ID
test[, group := cumsum(!is.na(value) & shift(is.na(value), fill = TRUE))]

# 按分组计算均值,NA行保持NA
test[, value_new := ifelse(is.na(value), NA, mean(value, na.rm = TRUE)), by = group]

# 移除临时分组列(可选)
test[, group := NULL]

方法二:用rle函数识别连续序列

# 用rle识别连续非NA的区间
rle_result = rle(!is.na(test$value))
# 生成每个行对应的分组ID
test[, group := rep(seq_along(rle_result$values), rle_result$lengths)]

# 按分组计算均值
test[, value_new := ifelse(is.na(value), NA, mean(value, na.rm = TRUE)), by = group]

# 移除临时分组列(可选)
test[, group := NULL]

3. 验证结果

运行代码后,test表的结果与预期一致:

print(test)
#          date   value value_new
# 1: 2006-01-31      NA        NA
# 2: 2006-03-20 -0.0280   -0.0280
# 3: 2006-03-28      NA        NA
# 4: 2006-05-03  0.0245    0.0080
# 5: 2006-05-04 -0.0080    0.0080
# 6: 2006-06-29      NA        NA
# 7: 2006-09-11 -0.0090   -0.0090

逻辑说明

  • 分组逻辑:通过识别连续非NA序列的起始位置(方法一)或直接用rle提取连续区间(方法二),为每个连续非NA序列分配唯一分组ID;
  • 均值计算:按分组对value列计算均值,同时通过ifelse保证原value为NA的行,value_new仍为NA。

内容的提问来源于stack exchange,提问作者jalaj pathak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:35:27