我有一个包含1300万行的数据集,如下所示:
dateInt secid dret weeknum
12470 20080107 2234 -0.021197471 20080107
12471 20080107 4533 -0.029914530 20080107
12472 20080107 5325 -0.013240986 20080107
12473 20080107 6048 0.007226014 20080107
....
22472 20080108 69343 -0.01158537 20080107
22473 20080108 69450 0.05555556 20080107
22474 20080108 69479 0.00000000 20080107
...
其中date
和secid
是唯一标识符(虽然与我下面的问题不太相关,但weeknum
是一个可能对许多date
值都很常见的值,例如date = 20080107 or 20080108 or 20080109 or 20080110 or 20080111
)。
考虑以下两个函数(一个用于data.table
,一个用于data.frame
):
avefast<-function (x, ..., FUN = mean) {
if (missing(...))
FUN(x)
else {
g <- as.factor(paste(..., sep = "|"))
split(x, g) <- lapply(split.default(x, g), FUN)
x
}
}
avefaster<-function(x,...,FUN=mean) {
if (missing(...)) FUN(x) else {
g<-as.factor(paste(...,sep="|"))
dt<-data.table(x,g)
setkeyv(dt,"g")
as.data.frame(dt[,y:=FUN(x),by="g"])$y
}
}
avefast
和avefaster
都是ave
的更快版本(两者都比ave
快一点,avefast
通常快15% ,如果使用avefaster
进行衡量,system.time
通常会快25%。
我尝试了以下两个功能 - 两者都是为了在每个dateInt
和weeknum
组合中获得secid
的最大值。
prcretw$retain<-avefast(prcretw$dateInt,prcretw$weeknum,prcretw$secid,FUN=max)
prcretw$retain2<-avefaster(prcretw$dateInt,prcretw$weeknum,prcretw$secid,FUN=max)
在大多数情况下,avefaster
给出与avefast
(或ave
)相同的答案,但对于11%的案例,它给出了错误的答案,我无法弄清楚原因。例如,我的数据集中的典型案例是
dateInt secid dret weeknum retain retain2
...
20080107 191432 0.0119658120 20080107 20080111 20080110
20080108 191432 -0.0152027027 20080107 20080111 20080111
20080109 191432 -0.0145797599 20080107 20080111 20080111
20080110 191432 0.0182767624 20080107 20080111 20080111
20080111 191432 -0.0461538462 20080107 20080111 20080111
20080114 191432 0.0349462366 20080114 20080118 20080118
20080115 191432 -0.0294372294 20080114 20080118 20080118
20080116 191432 0.0240856378 20080114 20080118 20080118
20080117 191432 -0.0322299652 20080114 20080118 20080118
20080118 191432 -0.0072007201 20080114 20080118 20080118
...
在上面的结果摘录中,使用avefaster
的{{1}}给出了data.table
和secid==191432
的错误答案。
也许我错误地使用了dateInt=20080107
。是否有人可以查看我上面发布的代码,特别是data.table
函数,如果有任何可能的错误指向我?
感谢。
*编辑*
只是编辑我的一个旧帖子。我发现了这个问题。只要data.table中有一个关键列avefaster
,执行NA
操作时似乎就会出现错误的答案 - 即使对于关键列不是by
的情况也是如此。上面的data.frame方法没有这个问题,因为所有NA
键都组合在一起。如果我们从data.table中删除NA
个密钥,则NA
操作的答案会得到纠正。