【问题标题】:Using data table to find min in group for rows that fulfil row-specific criteria使用数据表在组中查找满足特定行条件的行的最小值
【发布时间】:2017-11-03 02:39:16
【问题描述】:

我认为应该可以使用非 equi 连接执行以下操作,但无法使其工作。几周前我问的这个问题的扩展:Fast way to find min in groups after excluding observations using R

我有一组应用程序数据。如果分数高于分界线,您将被录取。现在我想确定哪些应用程序是严格控制的。 IE。当某人将一个选项的优先级低于另一个边距较低的选项,因此永远不会被允许使用该选项。

即当将特定行的cutoff 与同一组中具有较低优先级数的所有行进行比较时,如果有较高优先级(较低优先级)的选择具有较低的截止值,则设置受控= 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]

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    是的,可以使用非 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)]
    

    【讨论】:

    • 谢谢!为此,使用 cummin 真的要简单得多。太好了!
    猜你喜欢
    • 2021-05-15
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2021-02-01
    • 2013-10-19
    • 1970-01-01
    相关资源
    最近更新 更多