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
相关产品推荐
相关产品推荐

