这是一个很好的例子来说明我的任务。我有一个大数据集,让我们说数据表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
... ... ...
等等。 我现在想要进行某些分析:
sapply(dt[date==date[1] & exdate > exdate[1],X],function(x) x>dt[date==date[1] & exdate = exdate[1],X])
我尝试过使用data.table方法的组合进行切片,并在每个列上迭代迭代for循环。不用说,这需要很长时间。
我的下一个想法是使用多维数组同时执行分析,但我无法使其工作。
我的最后一次尝试是探索data.tables .SD和.GRP选项,但这种方法并不富有成效,尽管我认为我只是在这里遗漏了一些东西,这可能是一个选择。
我在这个论坛上已经阅读了很多关于切片和优化的内容,但鉴于我所应用的公式并不是微不足道的(例如可以考虑平均值/ sum / average),我无法应用给定的解决方案。
因此,如果有人在此之前处理过这样的问题/任务或知道此事,我将非常感谢我能得到的任何帮助!
谢谢!
答案 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
。