我需要找到并添加一个值为' 1':
的列z_axis
的每个组值,最小x_axis
的行(如果有平局,最小y_axis
z_axis
的每个组值,最小y_axis
的行(如果有平局,最小x_axis
因此对于以下DT
,
set.seed(2)
library(data.table)
test_surfaces<-data.table(
x_axis=c(sample(1:10,20,replace = T)),
y_axis=c(sample(1:10,20,replace = T)),
z_axis=c(sample(1:3,20,replace=T)),
avail=c(sample(0:1,20,replace=T))
)
我试过
test_surfaces[,.SD[which(y_axis==min(y_axis))][1,candidate:=1],by=z_axis]
test_surfaces[,.SD[which(x_axis==min(x_axis))][1,candidate:=1],by=z_axis]
给出输出
z_axis x_axis y_axis avail cand
1: 3 2 2 0 1
2: 3 6 2 0 NA
3: 3 1 2 1 NA
4: 1 6 1 0 1
5: 2 9 4 0 1
可以按组查找最小值。但
x_axises
并选择最小y_axis
的那个(即它应该选择第3行,而不是z_axis=3
join()
,但它并不优雅。 答案 0 :(得分:1)
您可以尝试按x_axis
和y_axis
排序,然后只为每个组分配第一个值为1。这将为每个组首先放置最低的x_axis
/ y_axis
组合。
test_surfaces[order(z, x_axis, y_axis),
candidate:=rep(c(1,0), times = c(1, .N - 1)), by = z]
test_surfaces[order(z, y_axis, x_axis), candidate:=c(1, candidate[-1]), by = z]
head(test_surfaces[order(z, x_axis, y_axis)])
# x_axis y_axis z avail candidate
#1: 2 2 1 0 1
#2: 3 2 1 0 0
#3: 5 6 1 0 0
#4: 6 1 1 0 1
#5: 6 9 1 1 0
#6: 8 4 1 1 0