Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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_Replace_Conditional_Data.table_Subset - Fatal编程技术网

R 使用'替换data.table中的行值;由';和条件

R 使用'替换data.table中的行值;由';和条件,r,replace,conditional,data.table,subset,R,Replace,Conditional,Data.table,Subset,我试图根据分组中另一列的条件替换列中的某些行值 编辑:编辑以突出问题的递归性质 例如 在每个“y”中,我想用2222(或实际上是函数的结果)替换“x”的值,其中“v”有一个观测值v+t(例如t=3),得到以下结果: 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”中,我想用2222(或实际上是函数的结果)替换“x”的值,其中“v”有一个观测值v+t(例如t=3),得到以下结果:

   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]

表示它在组内进行了正确的索引,但我不理解(或不理解)会发生什么

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

或者,您可以创建一个逻辑索引列,然后在下一步中进行赋值

 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]

indx@Frank OP改变了这个例子。它以前是
integer
类。哦,刚刚注意到:
by=y
在这里应该没有什么区别,对吧?哦,对不起,不确定你是否理解了我的意思:
DT[x='a',v:=10L]
做了同样的事情,我的意思是。@Frank,当然,它做了,而且速度更快。我试图模仿OP的代码。我不确定我是否理解编辑输出。奇怪的问题。。。我会选择
indx
 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
indx <- DT[, .I[which((v-3) %in% v)], by = y]$V1
DT[indx, x := 2222]