r中的数据帧和数据表有不同的结果

时间:2013-12-18 16:04:36

标签: r data.table

我有一个包含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
...

其中datesecid是唯一标识符(虽然与我下面的问题不太相关,但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
  }  
}

avefastavefaster都是ave的更快版本(两者都比ave快一点,avefast通常快15% ,如果使用avefaster进行衡量,system.time通常会快25%。

我尝试了以下两个功能 - 两者都是为了在每个dateIntweeknum组合中获得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.tablesecid==191432的错误答案。

也许我错误地使用了dateInt=20080107。是否有人可以查看我上面发布的代码,特别是data.table函数,如果有任何可能的错误指向我?

感谢。

*编辑*

只是编辑我的一个旧帖子。我发现了这个问题。只要data.table中有一个关键列avefaster,执行NA操作时似乎就会出现错误的答案 - 即使对于关键列不是by的情况也是如此。上面的data.frame方法没有这个问题,因为所有NA键都组合在一起。如果我们从data.table中删除NA个密钥,则NA操作的答案会得到纠正。

0 个答案:

没有答案