如何将循环中Box.test的结果添加到数据框新列?
解决Ljung-Box检验结果批量写入数据框的问题
问题背景
你有多列时间序列数据集df,需要对每列执行Ljung-Box检验(通过Box.test实现),并将检验得到的p值和卡方值分别写入已有数据框df2的p_value和x列,但原循环写法会导致所有行结果相同,无法完成对应赋值。
示例数据
# 时间序列数据集 a <- c(0.2569, 0.0145896, 0.0369, 0.025986, 0.12569, 0.3695) b <- c(0.125, 0.04582, 0.2569, 0.256369, 0.25698, 0.1456) c <- c(0.2584, 0.05698, 0.1258, 0.2569, 0.098563, 0.1569) df <- data.frame(a,b,c) # 待写入结果的数据框 d <- c("series1", "series2", "series3") e <- c("green", "black", "red") f <- c(18, 24, 12) p_value <- NA # 空列用于存储p值 x <- NA # 空列用于存储卡方值 df2 <- data.frame(d,e,f,p_value,x)
解决方案
方法1:修正循环写法
原循环的问题是每次计算的结果会被覆盖,且未按索引赋值到df2的对应行。修正后代码如下:
for(i in 1:ncol(df)) { # 执行Ljung-Box检验,移除冗余的赋值操作 box_result <- Box.test(df[ , i], type = "Ljung-Box") # 将结果写入df2的第i行对应列 df2$p_value[i] <- box_result$p.value df2$x[i] <- box_result$statistic } # 查看最终结果 print(df2)
方法2:用apply函数实现非循环写法
如果想避免循环,可使用apply批量处理,代码更简洁高效:
# 批量处理每一列,提取p值和卡方值 test_results <- t(apply(df, 2, function(col) { res <- Box.test(col, type = "Ljung-Box") return(c(res$p.value, res$statistic)) })) # 将结果批量赋值给df2的对应列 df2$p_value <- test_results[, 1] df2$x <- test_results[, 2] # 查看最终结果 print(df2)
关键说明
- 原代码中
df[ , i] <- df[ , i]是冗余操作,直接传入df[,i]即可完成检验 - 循环写法中必须通过索引
[i]指定df2的赋值行,否则会覆盖为最后一次循环的结果 apply方法通过转置(t())让结果的行顺序和df2的行顺序匹配,实现批量赋值
内容的提问来源于stack exchange,提问作者Bellis
相关产品推荐
相关产品推荐

