R data.table上一行带条件语句的值
我想根据数据表值是否满足条件来更新它,并返回另一列的值或上面行(同一列)的值。 例如:R data.table上一行带条件语句的值,r,data.table,R,Data.table,我想根据数据表值是否满足条件来更新它,并返回另一列的值或上面行(同一列)的值。 例如: library( data.table ) data <- data.table( Col1 = 1:5, Col2 = letters[1:5] ) 如果您能给我一些建议,我将不胜感激 *请忽略我在本例中使用的get(),因为我知道这可能不是最好的方法 这个古老的、迄今尚未回答的问题最近又重新出现了 截至今天,我知道以下方法: 1. 动物园::na.locf() 根据: 2. cumsum() 它不
library( data.table )
data <- data.table( Col1 = 1:5, Col2 = letters[1:5] )
如果您能给我一些建议,我将不胜感激
*请忽略我在本例中使用的
get()
,因为我知道这可能不是最好的方法 这个古老的、迄今尚未回答的问题最近又重新出现了
截至今天,我知道以下方法:
1. <代码>动物园::na.locf()
根据:
2. <代码>cumsum()
它不是很data.table-ish,但是使用
library(zoo)
,您可以执行数据[Col1==3,Col3:=Col1][,Col3:=na.locf(Col3,na.rm=FALSE)]
。不过,我怀疑data.table有一种更为惯用的方式。下一个版本(v1.9.8)很可能会有相当高效的此类操作的实现。谢谢@Frank。我刚刚注意到,当我在一个更大的数据集上使用它时,例如:data3@user3740289哦,糟糕,那只是因为我输入的条件错误data3[Col2=='c',Col3:=Col1][,Col3:=na.locf(Col3,na.rm=FALSE)]
注意,Col2=='c'
现在显示在开始处。您可以分块运行它来调试data3[Col2=='c',Col3:=Col1]
然后data3[,Col3:=na.locf(Col3,na.rm=FALSE)]
在每一步之后检查数据。是的,我应该已经发现了这一步。它现在运行得很好,谢谢。@user:10225690为了响应您的请求,我添加了一个答案。
data2 <- data.table( Col1= 1:5, Col2= letters[1:5], Col3= c("NA", "NA", "3", "3", "3"))
data[ , ( Col3 ) := ifelse( get( Col2 ) == "c", get( Col1 ) , shift( Col3 ))]
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
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