我认为应该可以使用非equi连接执行以下操作,但无法使其工作。几个星期前我问过这个问题的扩展名:Fast way to find min in groups after excluding observations using R。
我有一组应用程序数据。如果分数高于截止值,则表示您被录取。现在我想确定哪些应用程序是严格控制的。即当某人优先考虑的选择低于另一个选择时,利润率较低,因此永远不会接受该选项。
即。当将特定行的cutoff
与同一组中具有较低prio数的所有行进行比较时,如果存在具有较低截止值的较高优先级(较低prio)选项,则设置dominated = TRUE。
以下代码有效但速度相当慢:
library(data.table)
dt <- data.table(prio = c(c(1,2,4,5,6,7,8), c(1,2,4,5), c(1,2,4,5,6,7,8), c(1,2,4,10,13)),
c = c(c(20,16,19,20,21,11,22), c(1.5, 1.3, 1.7, 1.2), c(20,16,19,20,21,11,22), c(123,332,121,334,335)),
admission_group = c(rep("X", 7), rep("Y", 4), rep("X", 7), rep("Z", 5)),
individual = c(rep("A", 11), rep("B", 12)),
dominated = rep(FALSE, 23))
dt[,
min_c_lower_prio :=
unname(sapply(split(outer(prio,prio, "<="),
rep(1:length(prio),
each = length(prio))),
FUN = function(x) min(c[x], na.rm = TRUE))),
by = .(admission_group, individual)
]
dt[c > min_c_lower_prio, dominated := TRUE]
答案 0 :(得分:3)
是的,可以使用非equi连接完成:
dt[, d := dt[.SD, on=.(admission_group, individual, prio < prio, c < c), mult="first",
.N > 0, by=.EACHI]$V1]
或者,按优先级排序并使用cummin
:
dt[order(prio), d2 := c > cummin(c), by=.(admission_group, individual)]