带有过滤器data.table的笛卡尔积

奇苏

我正在尝试通过data.table调用替换SQL生产的笛卡尔积。我在资产和价值方面拥有悠久的历史,并且需要所有组合的子集。假设我有一个表T,其中T = [日期,合同,价值]。在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

在RI现在有以下内容

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)]

我相信我的解决方案会首先创建所有组合(在本例中为13,500行),然后进行过滤(至3000)。但是,SQL(并且我可能错了)联接子集,更重要的是不要将所有组合都加载到RAM中。任何想法如何更有效地使用data.table?

阿伦

使用= .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-expression的.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已经过优化在解决这些情况之前,您可以通过以下方式解决它:

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]

这需要0.045秒,而不是方法中的0.005秒。但是每次都by = .EACHI评估j-expression(因此评估内存效率)。那是您必须接受的权衡。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有Itertools的格雷码顺序的笛卡尔积?

来自分类Dev

带有转置列的Google表格笛卡尔积

来自分类Dev

带有空 Seq 的笛卡尔积(组合)

来自分类Dev

没有笛卡尔积的INNER JOIN的替代品

来自分类Dev

潜在无限序列的有限序列的笛卡尔积

来自分类Dev

Java7笛卡尔积versia没有重复

来自分类Dev

从Java中的list <list <int >>查找所有排列(笛卡尔积)

来自分类Dev

没有迭代器和/或循环的Numpy数组的组合/笛卡尔积

来自分类Dev

使用JPA和Hibernate加载没有N + 1笛卡尔积的递归对象图

来自分类Dev

`np.dot`,在剩余轴上没有笛卡尔积

来自分类Dev

Python Pandas自合并以合并笛卡尔积,以产生所有组合和总和

来自分类Dev

如何从numpy中的两个向量中获得所有对的笛卡尔积?

来自分类Dev

两个有条件的numpy数组的笛卡尔积

来自分类Dev

连接两个列表的笛卡尔积的字符串(最好没有for循环)

来自分类Dev

从Java中的list <list <int >>查找所有排列(笛卡尔积)

来自分类Dev

[Javascript]获取所有数组组合(笛卡尔积)

来自分类Dev

笛卡尔积的倒数

来自分类Dev

获取笛卡尔积?

来自分类Dev

火花笛卡尔积

来自分类Dev

笛卡尔积的倒数

来自分类Dev

生成笛卡尔积

来自分类Dev

字典的笛卡尔积

来自分类Dev

R data.table-笛卡尔连接的最佳选择

来自分类Dev

带有过滤条件的data.table group by

来自分类Dev

带有过滤条件的data.table group by

来自分类Dev

带有过滤器的GetPivotData

来自分类Dev

带有过滤器的mdChips

来自分类Dev

同时排序,行过滤器和带有data.table的列选择

来自分类Dev

是否有一种算法可以从一组公式中提取最小数量的笛卡尔积?

Related 相关文章

热门标签

归档