使用'替换data.table中的行值。和条件

时间:2015-04-23 12:19:00

标签: r replace conditional data.table subset

我正在尝试根据分组中另一列中的条件替换列中的某些行值。

编辑:进行了编辑,以突出问题的递归性质。

E.g。

DT = data.table(y=rep(c(1,3), each = 3)
            ,v=as.numeric(c(1,2,4,4,5,8))
            ,x=as.numeric(rep(c(9:11),each=2)),key=c("y","v"))
DT
   y v  x
1: 1 1  9
2: 1 2  9
3: 1 4 10
4: 3 4 10
5: 3 5 11
6: 3 8 11

在每个' y'中,我想要替换' x'在哪里' v'观察v + t(例如t = 3),2222(或实际上是函数的结果)得到以下结果:

   y v  x
1: 1 1  9
2: 1 2  9
3: 1 4 2222
4: 3 4 10
5: 3 5 11
6: 3 8 2222

我尝试了以下内容,但无济于事。

  DT[which((v-3) %in% v), x:= 2222, y][]

它神秘地(?)导致:

   y v  x
1: 1 1  9
2: 1 2  9
3: 1 4 2222
4: 3 4 2222
5: 3 5 2222
6: 3 8 2222

运行:

DT[,print(which((v-3) %in% v)), by =y]

表示它在组内进行了正确的索引,但是我不明白(或缺少)会发生什么。

1 个答案:

答案 0 :(得分:5)

您可以尝试使用replace(可能会产生一些开销,因为它会复制整个x

 DT[, x:=replace(x, which(v %in% (v+3)), 2222), by=y]
 #   y v    x
 #1: 1 1    9
 #2: 1 2    9
 #3: 1 4 2222
 #4: 3 4   10
 #5: 3 5   11
 #6: 3 8 2222

或者,您可以创建逻辑索引列,然后在下一步中执行分配

 DT[,indx:=v %in% (v+3), by=y][(indx), x:=2222, by=y][, indx:=NULL]
 DT
 #   y v    x
 #1: 1 1    9
 #2: 1 2    9
 #3: 1 4 2222
 #4: 3 4   10
 #5: 3 5   11
 #6: 3 8 2222

或使用.I稍微修改您自己的方法以创建索引

indx <- DT[, .I[which((v-3) %in% v)], by = y]$V1
DT[indx, x := 2222]