在data.table中用0填充缺少的组数据

时间:2016-03-11 15:08:19

标签: r data.table

这不是this的欺骗。那个问题涉及已经有NAs的行,我的问题是处理缺少的行,其数据点应为0。

假设我有这个data.table

dt<-data.table(id=c(1,2,4,5,6,1,3,4,5,6),
           varname=c(rep('banana',5),rep('apple',5)),
            thedata=runif(10,1,10))

对于每个varname,为id添加0的遗失thedata的最佳方式是什么?

此刻我用fill=0播放然后再次融化,但这似乎不是很有效。

melt(dcast.data.table(dt,id~varname,value.var='thedata',fill=0),id.var='id',variable.factor=FALSE,variable.name='varname',value.name='thedata')

我也只是想过这样做,但是最后填写NAs会有点笨拙

merge(dt[,CJ(id=unique(id),varname=unique(varname))],dt,by=c('varname','id'),all=TRUE)[,.(varname,id,thedata=ifelse(!is.na(thedata),thedata,0))]

在此示例中,我只使用了一个id列,但任何其他建议都应该可扩展为包含多个id列。

编辑

我对每个方法做了一个system.time,数据集较大,融合/演员方法需要2-3秒,而合并/ CJ方法需要12-13。

EDIT2

Roland的CJ方法比我的方法要好得多,因为我的数据集只花了4-5秒。

有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

setkey(dt, varname, id)
dt[CJ(unique(varname), unique(id))]
#    id varname  thedata
# 1:  1   apple 9.083738
# 2:  2   apple       NA
# 3:  3   apple 7.332652
# 4:  4   apple 3.610315
# 5:  5   apple 7.113414
# 6:  6   apple 9.046398
# 7:  1  banana 3.973751
# 8:  2  banana 9.907012
# 9:  3  banana       NA
#10:  4  banana 9.308346
#11:  5  banana 1.572314
#12:  6  banana 7.753611

如果必须(通常不合适),请将NA替换为0