我想更新数据表值,具体取决于它是否符合条件,并返回另一列的值或上一行的值(同一列)。 举个例子:
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()
,因为我知道这可能不是最好的方法。
答案 0 :(得分:0)
这个古老的,至今未解决的问题最近已经恢复。
到目前为止,我知道以下方法:
zoo::na.locf()
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
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