优化data.table代码进行切片和计算

时间:2017-08-23 14:11:52

标签: r optimization dataframe execution-time

这是一个很好的例子来说明我的任务。我有一个大数据集,让我们说数据表dt,列数为date,exdate(截止日期)和价格X(例如exdate的交付价格)。

date          exdate       X
1999-01-01   1999-02-01   100
1999-01-01   1999-01-17    50
1999-01-01   1999-05-01    75
1999-01-02   1999-01-17    60
1999-01-02   1999-04-02    50
...            ...         ...

等等。 我现在想要进行某些分析:

  1. 对于每个日期和每个exdate,我想将函数应用于与当前exdate相关的exdates 更大的所有价格。 (例如,检查价格是否更高:sapply(dt[date==date[1] & exdate > exdate[1],X],function(x) x>dt[date==date[1] & exdate = exdate[1],X])
  2. 与1.相同,但现在采取相同的过时,并寻找对应于大于当前价格的所有产品,并再次应用某些公式。
  3. 我尝试过使用data.table方法的组合进行切片,并在每个列上迭代迭代for循环。不用说,这需要很长时间。

    我的下一个想法是使用多维数组同时执行分析,但我无法使其工作。

    我的最后一次尝试是探索data.tables .SD和.GRP选项,但这种方法并不富有成效,尽管我认为我只是在这里遗漏了一些东西,这可能是一个选择。

    我在这个论坛上已经阅读了很多关于切片和优化的内容,但鉴于我所应用的公式并不是微不足道的(例如可以考虑平均值/ sum / average),我无法应用给定的解决方案。

    因此,如果有人在此之前处理过这样的问题/任务或知道此事,我将非常感谢我能得到的任何帮助!

    谢谢!

1 个答案:

答案 0 :(得分:0)

关于第一个问题,可以使用data.table非等自连接来解决这个问题

library(data.table)   # CRAN version 1.10.4 used
# coerce to data.table and order data for later comparisons
setorder(setDT(DT), date, exdate, X)
# non-equi self-join
DT[DT, on = c("date", "exdate>=exdate"), 
   # aggregate
   .(min.X = min(X), min.exdate = x.exdate[which.min(X)], n.lt.1st = sum(X < first(X)),
     max.X = max(X), max.exdate = x.exdate[which.max(X)], n.gt.1st = sum(X > first(X))), 
   # for each join group
   by = .EACHI]
         date     exdate min.X min.exdate n.lt.1st max.X max.exdate n.gt.1st
1: 1999-01-01 1999-01-17    50 1999-01-17        0   100 1999-02-01        2
2: 1999-01-01 1999-02-01    75 1999-05-01        1   100 1999-02-01        0
3: 1999-01-01 1999-05-01    75 1999-05-01        0    75 1999-05-01        0
4: 1999-01-02 1999-01-17    50 1999-04-02        1    60 1999-01-17        0
5: 1999-01-02 1999-04-02    50 1999-04-02        0    50 1999-04-02        0

聚合只是显示最小值的示例,最小值的exdate,小于第一个值的数值,以及相应的最大值。

请注意,条件为exdate>=exdate,而不是exdate>exdate。这是为了与结果集进行比较,在结果集中包含“参考行”,即X < first(X)

对于第二个问题,尚不清楚产品所指的是什么。

数据

library(data.table)
DT <- fread(
  "date          exdate       X
1999-01-01   1999-02-01   100
1999-01-01   1999-01-17    50
1999-01-01   1999-05-01    75
1999-01-02   1999-01-17    60
1999-01-02   1999-04-02    50"
)
cols <- c("date", "exdate")
DT[, (cols) := lapply(.SD, as.IDate), .SDcols = cols]
str(DT)
Classes ‘data.table’ and 'data.frame':    5 obs. of  4 variables:
 $ date   : IDate, format: "1999-01-01" "1999-01-01" "1999-01-01" "1999-01-02" ...
 $ exdate : IDate, format: "1999-01-17" "1999-02-01" "1999-05-01" "1999-01-17" ...
 $ X      : int  50 100 75 60 50
 $ refdate: IDate, format: "1999-01-17" "1999-02-01" "1999-05-01" "1999-01-17" ...
 - attr(*, ".internal.selfref")=<externalptr>

请注意,datatable拥有整数存储的日期类IDate