这不是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秒。
有更好的方法吗?
答案 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
。