查找列的最小值并按组添加新列

时间:2017-10-19 12:41:21

标签: r data.table

我需要找到并添加一个值为' 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

可以按组查找最小值。但

  1. 它不会比较x_axises并选择最小y_axis的那个(即它应该选择第3行,而不是z_axis=3
  2. 的第1行
  3. 数据表不会永久修改(即列&#39; cand&#39;不是永久网)。为此,我知道我可以使用join(),但它并不优雅。

1 个答案:

答案 0 :(得分:1)

您可以尝试按x_axisy_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