0

我正在使用一个大型数据集,该数据集每月测量多个位置,但每个站点都有不同数量的测量和 NA,从而创建了一个损坏的时间序列。为了解决这个问题,我创建了一个 for 循环,在每个站点循环,以使用插值技术填补空白。由此,我得到一个插值输出,理想情况下希望将其添加回原始数据集中。例如:

library(imputeTS)

Sites = c(rep("A", 5), rep("B", 4), rep("C", 10))
Meas = c(25,20,NA,21,NA,23,21,22,26,27,15,20,NA,25,NA,28,28,27,NA)

df= data.frame(Sites, Meas)

for(i in Sites) {
d = subset(df, Sites = i)
d$fit = na.interpolation(d$Meas)
}

我想要的是取 d$fit 并将其重新匹配到一个新列 df$fit 中,以便正确匹配测量次数和每个站点。有什么建议,或者对我的方法进行彻底改革?提前致谢!

4

1 回答 1

0

您实际上并不经常需要 for 循环。您可以使用该ave()功能执行此特定任务

df$fit <- ave(df$Meas, df$Sites, FUN=na.interpolation)

在这种情况下,该函数将该函数应用于na.interpolation每个Meas不同值的每个值,Sites然后将所有内容按正确的顺序放回原处。

您可以用于更复杂的事情的另一个策略是split/unsplit. 就像是

ss <- split(df$Meas, df$Sites)
df$fit <- unsplit(lapply(ss, na.interpolation), df$Sites)
于 2018-01-22T20:59:33.037 回答