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

R语言时间序列数据循环计算所有列组合NDI生成新数据集求解

实现代码

步骤1:数据预处理(修正示例数据问题)

你提供的示例数据存在赋值符号错误、数值列存储为字符串、日期未格式化的问题,先修正为可用格式:

library(lubridate)
# 修正后的示例数据集
data <- data.frame(
  Date = mdy_hm(sample(c("8/7/2014 23:01", "8/8/2014 10:01", "8/7/2014 11:01", "8/7/2014 12:01", "8/7/2014 13:01"))),
  `361` = as.numeric(sample(c("0.035", "0.039", "0.032", "0.042", "0.033"))),
  `362` = as.numeric(sample(c("0.038", "0.043", "0.054", "0.023", "0.076"))),
  `363` = as.numeric(sample(c("0.038", "0.040", "0.040", "0.020", "0.083"))),
  check.names = FALSE
)

步骤2:批量计算所有列对的NDI

基础循环版本(逻辑清晰,适合小数据量)

# 提取所有数值列名(排除日期列)
value_cols <- setdiff(colnames(data), "Date")
# 生成所有不重复的两两组和,避免重复计算(a,b)和(b,a)
col_pairs <- combn(value_cols, 2, simplify = FALSE)

# 初始化结果表,保留日期列
ndi_result <- data[, "Date", drop = FALSE]

# 遍历所有列对计算NDI
for (pair in col_pairs) {
  x <- data[[pair[1]]]
  y <- data[[pair[2]]]
  ndi_vals <- (x - y) / (x + y)
  # 按要求命名新列
  new_col <- paste0("NDI(", pair[1], ":", pair[2], ")")
  ndi_result[[new_col]] <- ndi_vals
}

向量化版本(速度更快,适合数百列、数千行的大规模数据)

value_cols <- setdiff(colnames(data), "Date")
# 批量计算所有列对的NDI值
ndi_values <- combn(value_cols, 2, function(pair) {
  (data[[pair[1]]] - data[[pair[2]]]) / (data[[pair[1]]] + data[[pair[2]]])
})
# 生成对应列名
colnames(ndi_values) <- combn(value_cols, 2, function(pair) paste0("NDI(", pair[1], ":", pair[2], ")"))
# 合并日期列得到最终结果
ndi_result <- cbind(data[, "Date", drop = FALSE], ndi_values)

注意事项

  • 提前将所有数值列转换为数值类型,避免字符串计算报错
  • 若存在x+y=0的情况,计算会返回Inf,可根据需求提前替换为NA或过滤对应行
  • 100列数据会生成4950个NDI列,属于R正常处理范围,无需担心性能问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:09:02