У меня есть data.table
с двумя полями, startvalue
и endValue
, которые мне нужно заполнить на основе некоторой информации из предыдущих и фактических строк.Хотя это как-то похоже на это и это , я не смог получить желаемые результаты.
Фиктивные данные:
a <- data.table(user = c("A", "A", "A", "B", "B"),
gap = c(1, 0, 2, 2, 3),
priority = c(1, 3, 2, 2, 1))
Затем я фиксирую startValue
для всех приоритетов == 1:
setkey(a, user, priority)
a[priority == 1, startValue := 0]
, и я устанавливаю endValue
для тех, которые startValue
уже определены:
a[!is.na(startValue), endValue := startValue + gap*3]
Теперь приходит проблема.Я хочу, чтобы startValue
в строке 2 (пользователь A, приоритет 2) был таким же, как endValue
в строке 1, чтобы я мог вычислить новый endValue
.Я знаю Я могу использовать цикл, но я хотел знать, возможно ли это сделать с помощью любой другой функции или комбинации функций.
Я пробовал несколько комбинаций shift
иzoo:na.locf
но всегда заканчивалось путаницей уже существующих значений.
Ожидаемый результат:
b <- structure(list(user = c("A", "A", "A", "B", "B"),
gap = c(1, 2, 0, 3, 2),
priority = c(1, 2, 3, 1, 2),
startValue = c(0, 3, 9, 0, 9),
endValue = c(3, 9, 9, 9, 15)),
row.names = c(NA, -5L),
class = c("data.table", "data.frame"))