在 R 中的 for 循环中迭代填充新列

Iteratively filling a new column in a for loop in R

我正在处理一个大型数据集,该数据集每月测量多个位置,但每个站点都有不同数量的测量和 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,以便正确匹配测量次数和每个站点。对我的方法有什么建议或彻底改革吗?提前致谢!

您实际上并不经常需要 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)