R语言气候数据趋势测试结果存DataFrame导出Excel报错求助
R气候数据趋势检验导出报错解决方案
报错根因
- 存储矩阵维度不匹配:预先定义的
Result只有100行2列,但mmky()、mkttest()返回的结果包含多个统计字段,且总循环次数(站点数×12个月)远大于100,赋值时维度不匹配直接触发报错。 - 循环索引逻辑错误:外层k循环和内层站点、月份循环没有绑定关系,多次迭代会重复覆盖同一个位置的存储值。
- 数据传入格式错误:提取单月序列时返回的是单列数据框,不符合检验函数的输入要求,会返回非预期长度的结果。
- 冗余绘图占用资源:
acf()默认生成统计图,大量循环下会导致程序卡顿甚至崩溃。
修复后可运行代码
# 加载依赖包,推荐用openxlsx替代xlsx,无需Java环境 library(openxlsx) library(lubridate) library(dplyr) library(modifiedmk) # 读取数据 Wabi <- read.csv("Tmin_17.csv", header = TRUE, sep = ",") Wabi$Date <- as.Date(Wabi$Date, format = "%m/%d/%Y") Wabi$month <- month(Wabi$Date) Wabi$year <- year(Wabi$Date) # 预先定义年数,根据你的实际数据长度修改 N <- 34 # 用列表存储结果,无需预先定义维度 result_list <- list() # 计数器,用于给列表赋值 count <- 1 # 遍历所有站点列(第2到17列是站点) for(j in 2:ncol(Wabi[,!colnames(Wabi) %in% c("month","year")])) { site_name <- colnames(Wabi)[j] # 计算当前站点的月均值 Wabi_mon <- Wabi %>% group_by(year, month) %>% summarise(!!site_name := mean(.data[[site_name]], na.rm = TRUE), .groups = "drop") # 遍历12个月份 for (i in 1:12) { # 提取当前月份的序列,转为向量 mon_series <- Wabi_mon %>% filter(month == i) %>% pull(.data[[site_name]]) # ACF检验,关闭绘图 acf_test <- acf(mon_series, lag.max = 1, plot = FALSE) # 选择对应的趋势检验方法 if (abs(acf_test$acf[2]) > abs(((-1 - 1.96*sqrt(N-1))/N) - 1)) { test_res <- as.data.frame(t(mmky(mon_series))) } else { test_res <- as.data.frame(t(mkttest(mon_series))) } # 添加站点、月份标识 test_res <- cbind(data.frame(site = site_name, month = i), test_res) # 存入列表 result_list[[count]] <- test_res count <- count + 1 } } # 合并所有结果为一个数据框 final_result <- bind_rows(result_list) # 导出到Excel write.xlsx(final_result, file = "tmin_trend.xlsx", sheetName = "Sheet1", overwrite = TRUE)
额外说明
如果仍使用原xlsx包导出,只需将library(openxlsx)替换为library(xlsx),write.xlsx参数保持原有写法即可。
内容的提问来源于stack exchange,提问作者Yon Balcha
相关产品推荐
相关产品推荐

