具有组条件的滞后R数据表

具有组条件的滞后R数据表,r,data.table,R,Data.table,我有这样的数据: test <- data.frame(id = c(1,2,1,5,5,5,6), time = c(0,1,4,5,6,7,9), cond = c("a","a","b","a","b","b","b"), value = c(5,3,2,4,0,3,1), stringsAsFactors=F) setDT(test)[,order := or

我有这样的数据:

test <- data.frame(id = c(1,2,1,5,5,5,6),
               time = c(0,1,4,5,6,7,9),
               cond = c("a","a","b","a","b","b","b"),
               value = c(5,3,2,4,0,3,1), 
               stringsAsFactors=F)

setDT(test)[,order := order(time),id][order(id,order)]

id time cond value order
1  0    a    5     1
2  1    a    3     1
1  4    b    2     2
5  5    a    4     1
5  6    b    0     2
5  7    b    3     3
6  9    b    1     1
id time cond value order prev
1  0    a    5     1     5
2  1    a    3     1     3
1  4    b    2     2     5
5  5    a    4     1     4
5  6    b    0     2     4
5  7    b    3     3     4
6  9    b    1     1     NA
我尝试了一些类似的函数,但只返回了NAs

test[, prev := shift(value[cond == 'b']), .(id,order)]

如果我正确理解了问题,一个选项可能是:

library(data.table)

setDT(test)[, order := order(time), id][order(id, order)]

test[, prev := {
  frst <- ifelse(cond[1] == "a", value[1],
                 ifelse(cond[1] == "b", NA, cond[1]))

  prev <- as.integer(ifelse(cond == "b" & shift(cond) == "b",
                            NA,
                            c(frst, shift(value)[-1])))

}, by = id][cond == "b", prev := zoo::na.locf(prev), by = id]

如果我正确理解了问题,一个选项可能是:

library(data.table)

setDT(test)[, order := order(time), id][order(id, order)]

test[, prev := {
  frst <- ifelse(cond[1] == "a", value[1],
                 ifelse(cond[1] == "b", NA, cond[1]))

  prev <- as.integer(ifelse(cond == "b" & shift(cond) == "b",
                            NA,
                            c(frst, shift(value)[-1])))

}, by = id][cond == "b", prev := zoo::na.locf(prev), by = id]

如果先分配非b值,
zoo:na.locf
可以完成其余的操作(向下填充b(na)值)


如果先分配非b值,
zoo:na.locf
可以完成其余的操作(向下填充b(na)值)

library(zoo)
test[cond != 'b', prev := value]
test[, prev := na.locf(prev), id]

test
#    id time cond value order prev
# 1:  1    0    a     5     1    5
# 2:  2    1    a     3     1    3
# 3:  1    4    b     2     2    5
# 4:  5    5    a     4     1    4
# 5:  5    6    b     0     2    4
# 6:  5    7    b     3     3    4
# 7:  6    9    b     1     1   NA