使用dplyr调用FitDoubleLogBeck函数时遭遇Indexes overlap错误
分组运行FitDoubleLogBeck的错误解决
错误根源
rbind.zoo()报的"indexes overlap"是因为FitDoubleLogBeck()返回的$predicted是zoo序列对象,每个分组的zoo索引(比如1-52)完全重复。dplyr::summarise合并分组结果时,zoo的合并逻辑不允许重复索引,因此报错。单独跑单个分组时没有合并操作,所以正常。
两种可行解决方法
方法1:将zoo结果转为向量后再汇总
把预测结果转成普通向量,绕过zoo的索引冲突:
library(dplyr) library(greenbrown) SNDVI0 <- dat %>% group_by(group) %>% summarise(smoothNDVI = as.vector(FitDoubleLogBeck(x, tout = F, weighting = T, hessian = F, plot = F, ninit = 10)$predicted))
如果需要把列表列展开成长格式,用tidyr::unnest:
SNDVI0 <- dat %>% group_by(group) %>% summarise(smoothNDVI = as.vector(FitDoubleLogBeck(x, tout = F, weighting = T, hessian = F, plot = F, ninit = 10)$predicted)) %>% tidyr::unnest(smoothNDVI)
方法2:用nest+map处理大规模分组
针对6000+组的场景,嵌套+映射的方式逻辑更清晰,也方便调试:
library(dplyr) library(purrr) library(greenbrown) library(tidyr) SNDVI0 <- dat %>% nest(data = -group) %>% mutate(smoothNDVI = map(data, ~ as.vector(FitDoubleLogBeck(.x$x, tout = F, weighting = T, hessian = F, plot = F, ninit = 10)$predicted))) %>% unnest(c(data, smoothNDVI))
这种方式会保留原始数据的每一行,同时对应添加分组后的预测值,适合后续分析。
注意事项
- 测试时可以先取小批量分组(比如
slice_sample(n=10))验证代码正确性,再跑全量数据。 - 两种方法都能解决索引冲突问题,方法2更适合大规模数据的可维护性。
内容的提问来源于stack exchange,提问作者aorali
相关产品推荐
相关产品推荐

