Итеративное заполнение нового столбца в цикле for в 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, чтобы количество измерений и каждый сайт соответствовали должным образом. Любые предложения, или полный пересмотр моего подхода? Заранее спасибо!

1 ответ

Решение

Это не часто, что вам действительно нужно для петель. Вы можете сделать эту конкретную задачу с 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)
Другие вопросы по тегам