作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 data.table 调用替换 SQL 生成的笛卡尔积。
我在 Assets 和值(value)方面有着悠久的历史,我需要所有组合的一个子集。
假设我有一个表 a,其中 T = [date, contract, value]。在 SQL 中它看起来像
SELECT a.date, a.contract, a.value, b.contract. b.value
FROM T a, T b
WHERE a.date = b.date AND a.contract <> b.contract AND a.value + b.value < 4
library(data.table)
n <- 1500
dt <- data.table(date = rep(seq(Sys.Date() - n+1, Sys.Date(), by = "1 day"), 3),
contract = c(rep("a", n), rep("b", n), rep("c", n)),
value = c(rep(1, n), rep(2, n), rep(3, n)))
setkey(dt, date)
dt[dt, allow.cartesian = TRUE][(contract != i.contract) & (value + i.value < 4)]
最佳答案
使用 by = .EACHI 功能。在 data.table
中,连接和子集非常紧密地联系在一起;即,连接只是另一个子集 - 使用 data.table
- 而不是通常的整数/逻辑/行名称。它们的设计方式考虑到了这些情况。
基于子集的连接允许在连接时合并 j
表达式和分组操作。
require(data.table)
dt[dt, .SD[contract != i.contract & value + i.value < 4L], by = .EACHI, allow = TRUE]
i.*
cols 用于条件,但不返回它们),但是,
.SD
尚未优化,并且为每个组评估
j
上的
.SD
表达式代价高昂.
system.time(dt[dt, .SD[contract != i.contract & value + i.value < 4L], by = .EACHI, allow = TRUE])
# user system elapsed
# 2.874 0.020 2.983
.SD
have already been optimised 。在处理这些情况之前,您可以通过以下方式解决此问题:
dt[dt, {
idx = contract != i.contract & value + i.value < 4L
list(contract = contract[idx],
value = value[idx],
i.contract = i.contract[any(idx)],
i.value = i.value[any(idx)]
)
}, by = .EACHI, allow = TRUE]
by = .EACHI
每次都会评估
j
表达式(因此内存效率高)。这是你必须接受的权衡。
关于r - 带过滤器 data.table 的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27059924/
我是一名优秀的程序员,十分优秀!