使用 'by' 和条件替换 data.table 中的行值
Replace row values in data.table using 'by' and conditions
我正在尝试根据分组内另一列中的条件替换一列中的某些行值。
编辑:编辑以突出问题的递归性质。
例如
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' 中,然后我想用 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]
表示它在组内进行了正确的索引编制,但是我不明白(或没有)发生了什么。
您可以尝试使用 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]
我正在尝试根据分组内另一列中的条件替换一列中的某些行值。
编辑:编辑以突出问题的递归性质。
例如
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' 中,然后我想用 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]
表示它在组内进行了正确的索引编制,但是我不明白(或没有)发生了什么。
您可以尝试使用 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]