我有data.table
两个字段,startvalue
和endValue
,我需要根据前一行和实际行中的一些信息进行填充。虽然这在某种程度上类似于this和this,但我无法得到我想要的结果。
虚拟数据:
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)与第 1 行相同endValue
,所以我可以计算新的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"))