В настоящее время я занимаюсь моделированием на основе определенных данных. Конечная цель заключается в создании столбца, в котором первое значение основано на одной формуле, а затем второе, третье и четвертое значения основаны на предыдущем значении. (например, запись № 2 зависит от № 1, № 3 от № 2). Я решил эту проблему, запустив функцию мутации 3 раза. Однако, имея в виду аккуратность, я хотел бы либо иметь короткий цикл, либо использовать одну из функций применения для одновременного выполнения всех трех повторов. Какие-либо предложения?
Вот пример:
sampleframe <- data.frame("value1" = c(15,18,22,19),
"value2" = c(12,14,13,12),
"parameter" = c(0.8,NA,NA,NA))
sampleframe <- sampleframe %>%
mutate("value3" = value2 * parameter)
Это генерирует кадр данных с первой строкой столбца value3 на основе одной формулы. Затем я хотел бы создать последние 3 строки. Я запускаю эту строку:
sampleframe <- sampleframe %>%
mutate(`value3`= ifelse(is.na(value3) == FALSE, value3,lag(value3) * value2))
который генерирует второе значение строки, сохраняя при этом значение первой строки. Затем мне нужно запустить одну и ту же команду еще два раза, чтобы заполнить последние 2 строки. Он работает в том смысле, что сохраняет предыдущие значения, всегда генерируя следующее, но кажется крайне неэффективным. Вернемся к моему вопросу, есть ли лучший способ сделать это? (предполагаю, что есть)
Изменить: учитывая решение для мурлыканья, я столкнулся со следующей проблемой при расширении моего приведенного выше примера. Если я хочу добавить константу в выражение, решение больше не работает:
sampleframe <- sampleframe %>%
mutate(`value3`= ifelse(is.na(value3) == FALSE, value3,lag(value3) * value2 + value 1))
В решении для мурлыканья:
sampleframe %>%
mutate(
value3 = if_else(row_number() == 1, value2*parameter, value2),
value3 = accumulate(value3, prod)
)
Каждый член в значении3 будет умножать значение 2. Проблема в том, что добавление константы после значения 2:
sampleframe %>%
mutate(
value3 = if_else(row_number() == 1, value2*parameter, value2 + value1),
value3 = accumulate(value3, prod)
)
Не дает желаемого результата, так как я не хочу, чтобы значение1 умножалось на значение2. Добавляем его во второй член:
sampleframe %>%
mutate(
value3 = if_else(row_number() == 1, value2*parameter, value2),
value3 = accumulate(value3, prod) + value1
)
также не работает, потому что он добавляет value1 в качестве блока в самом конце, что означает, что строки 1 и 2 вычисляются правильно, а 3 и 4 — нет. Я пытался любым способом заставить эту команду работать, но я недостаточно знаком с пакетом purrr, чтобы найти исправление. Любые идеи?