У меня есть таблица данных с двумя столбцами данных и двумя столбцами идентификаторов. Столбцы id - это годы со значениями (X2010, X2015, X2020 и т. Д.) И страны (cty1, cty2 и т. Д.). Для каждой страны первый набор столбцов данных (f1, f2, f3 и т. Д.) Имеет значение только в первой строке (X2010) и NA в остальных строках. Второй набор столбцов (x.f1, x.f2, x.f3 и т. Д.) Имеет NA в первой строке и различные значения в остальных строках. Я хочу заменить NA в первом наборе столбцов следующей рекурсивной структурой для каждой страны.
f1.X2015 = f1.X2010 * x.f1.X2015
f1.X2020 = f1.X2015 * x.f1.X2020
...
Я пробовал следующее
foods <- c("f1", "f2", "f3")
x.foods <- c("x.f1", "x.f"2, "x.f3")
res <- c("res.f1", "res.f2", "res.f3")
f.cumprod <- function(x,y) {return(first(x) * cumprod(replace(y), 1,1) * NA^(.I= 1))}
Вот структура таблицы данных, которая, как я думал, будет работать для генерации значений для столбцов res.
DT[,(res) := mapply(FUN = f.cumprod, x = .SD, y = list(x.foods)), .SDcols = foods, by = c("cty")]
Вот упрощенная версия только для одной страны
set.seed(24)
dt <- data.table(cty = c(rep("cty1", 5), rep("cty2", 5), rep("cty3", 5)), year = rep(c("X2010", "X2015", "X2020", "X2025", "X2030"), 3),
f1 = rep(c(0.9883415, rep(NA, 4)), 3), f2 = rep(c(1.0685221, rep(NA, 4)), 3), f3 = rep(c(1.0664189, rep(NA, 4)), 3),
x.f1 = rep(c(NA, rep(rnorm(4))), 3), x.f2 = rep(c(NA, rep(rnorm(4))), 3), x.f3 = rep(c(NA, rep(rnorm(4))), 3))
И хитрый и медленный способ получить результат для одного из продуктов питания, f1.
dt.subset <- dt[, c("f1", "x.f1"), with = FALSE]
for (i in 2:nrow(dt.subset)) {
dt.subset$f1[i] <- dt.subset$f1[i - 1] * dt.subset$x.f1[i]
}
Поскольку я хочу сделать это примерно для 170 стран и 20 продуктов питания (и с 4 сценариями), я надеюсь, что есть решение, аналогичное приведенному выше коду DT.