Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table上一行带条件语句的值_R_Data.table - Fatal编程技术网

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