带有条件语句的前一行的R data.table值

时间:2015-11-18 17:21:18

标签: r data.table

我想更新数据表值,具体取决于它是否符合条件,并返回另一列的值或上一行的值(同一列)。 举个例子:

library( data.table )
data <- data.table( Col1 = 1:5, Col2 = letters[1:5] )

我想返回以下内容:

data2 <- data.table( Col1= 1:5, Col2= letters[1:5], Col3= c("NA", "NA", "3", "3", "3"))

我已阅读?shift帮助页面,但我无法使用条件语句并在同一列中返回值。为了得到我想要的结果,我尝试过:

data[ , ( Col3 ) := ifelse( get( Col2 ) == "c", get( Col1 ) , shift( Col3 ))]

我很感激一些建议。

*请忽略我对此示例使用get(),因为我知道这可能不是最好的方法。

1 个答案:

答案 0 :(得分:0)

这个古老的,至今未解决的问题最近已经恢复。

到目前为止,我知道以下方法:

1。 zoo::na.locf()

根据Frank's comment

data3 <- data.table(Col1= 1:10, Col2 = c(letters[1:5],letters[1:5]))
data3[Col2=='c', Col3 := Col1][, Col3 := zoo::na.locf(Col3, na.rm=FALSE)]
data3[]
    Col1 Col2 Col3
 1:    1    a   NA
 2:    2    b   NA
 3:    3    c    3
 4:    4    d    3
 5:    5    e    3
 6:    6    a    3
 7:    7    b    3
 8:    8    c    8
 9:    9    d    8
10:   10    e    8

2。 cumsum()

data3 <- data.table(Col1= 1:10, Col2 = c(letters[1:5],letters[1:5]))
data3[, Col3 := Col1[which(Col2 == "c")], by = cumsum(Col2 == "c")]
data3[]
    Col1 Col2 Col3
 1:    1    a   NA
 2:    2    b   NA
 3:    3    c    3
 4:    4    d    3
 5:    5    e    3
 6:    6    a    3
 7:    7    b    3
 8:    8    c    8
 9:    9    d    8
10:   10    e    8