У меня есть неполные (временные) ряды, в которых я хотел бы заполнить пропущенные значения, используя доступные недавние значения и темпы роста из другого ряда, по категориям (странам).Категории, пропущенные значения не равны длине.Это требует применения функции к переменной последовательно: сначала мне нужно взять последнюю доступную точку данных (которая может быть где угодно) и разделить ее на 1 + скорость роста, затем перейти к следующей точке данных и сделать то же самое.
Пример набора данных и желаемый результат:
require(data.table)
DT_desired<-data.table(category=c(rep("A",4),rep("B",4)),
year=2010:2013,
grwth=c(NA,.05,0.1,0,NA,0.1,0.15,0.2))
DT_desired[,values:=c(cumprod(c(1,DT_desired[category=="A"&!is.na(grwth),grwth]+1)),cumprod(c(1,DT_desired[category=="B"&!is.na(grwth),grwth]+1)))]
DT_example <- copy(DT_desired)[c(1,2,3,5),values:=NA]
То, что я пробовал: вы можете сделать это с помощью цикла for, но это неэффективно и не рекомендуется в R. Мне понравилась эффективность data.tableи я бы предпочел сделать это таким образом.Я пробовал функцию сдвига таблицы данных, которая заполняет только одно пропущенное значение (что логично, поскольку он пытается выполнить в то же время, я думаю, когда остальные пропускают предыдущее значение).
DT_example[,values:=ifelse(is.na(values),shift(values,type = "lead")/(1+shift(grwth,type = "lead")),values),by=category]
Из других публикаций я узнал, что вы, вероятно, можете сделать это с помощью функции rollapply пакета zoo, но у меня только появилось ощущение, что я смогу сделать это в таблице данных без еще одного дополнительного пакета, и что решение относительнопростой и элегантный, просто я не достаточно опытен, чтобы его найти.
Это может быть дубликатом и извините, если я не заметил соответствующий пост, но ничего из того, что я нашел, не получилось именно так, как я хочу.