繁体   English   中英

如何避免 data.table 内的冗余计算?

[英]How to avoid redundant calculation within data.table?

我需要通过两个id1id2在数据表的数据列中找到唯一的两个最小值:

n <- 12
set.seed(1234)
id1 <- rep(1:2, each = 6)
id2 <- rep(1:6, each = 2)
data <- 100+100*rnorm(n)
dt <- data.table(id1=id1, id2=id2, data=data)

在下面找到 function ,给定第二个 id id2 ,同时计算两个唯一最小值并将它们导出为向量:

detect_two_lower <- function(ids, values){
  dt <- data.table(ids, values)
  dt <- dt[, .(V1=min(values, na.rm = T))
           , by = ids
  ][order(V1)]
  min_1 <- dt$V1[1]
  min_2 <- dt$V1[2]
  nn <- c(min_1 = min_1, min_2 = min_2)
}
detect_two_lower <- memoise(detect_two_lower)

然后在 data.table 上应用 function, by = id1分组:

dt[, `:=` ( min_1 = detect_two_lower(id2, data)[1]
           ,min_2 = detect_two_lower(id2, data)[2])
   , by = id1
]

计算按预期运行(见下文)。 但是请注意,代码使用相同的参数调用了两次detect_two_lower 作为一种解决方法,我尝试尽量减少使用memoise的返工,但我想避免使用这个补丁。 有没有更好的方法来实现相同的结果?

dt
    id1 id2         data        min_1     min_2
 1:   1   1  -20.7065749 -134.5697703 -20.70657
 2:   1   1  127.7429242 -134.5697703 -20.70657
 3:   1   2  208.4441177 -134.5697703 -20.70657
 4:   1   2 -134.5697703 -134.5697703 -20.70657
 5:   1   3  142.9124689 -134.5697703 -20.70657
 6:   1   3  150.6055892 -134.5697703 -20.70657
 7:   2   4   42.5260040    0.1613555  10.99622
 8:   2   4   45.3368144    0.1613555  10.99622
 9:   2   5   43.5548001    0.1613555  10.99622
10:   2   5   10.9962171    0.1613555  10.99622
11:   2   6   52.2807300    0.1613555  10.99622
12:   2   6    0.1613555    0.1613555  10.99622 

从 function 返回list

library(data.table)

detect_two_lower <- function(ids, values){
  dt <- data.table(ids, values)
  dt <- dt[, .(V1=min(values, na.rm = T)), by = ids][order(V1)]
  as.list(dt$V1)
}

因此,您可以直接分配它们:

dt[, c('min_1', 'min_2') := detect_two_lower(id2, data), id1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM