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