data.table中的键控查找

时间:2015-08-20 04:37:13

标签: r data.table

这是在执行聚合时从另一个data.table调用data.table键控查找的示例。代码失败,因为后一个data.table中的变量id和前一个表中的密钥var名称是相同的。我得到的错误是Error in rep(0, tot.dt[list(var, y)][["cnt"]] - .N) : invalid 'times' argument。为了使它工作,我必须在其中一个表中更改变量名称。

N <- 10000
data.dt <- data.table(obs=sample(1001:2000,N,replace=T), var=sample(101:200,N,replace=T))
data.dt <- unique(data.dt)[, value:=runif(.N)][]

obsmap.dt <- unique(data.dt[,.(obs)])[, y:=round(runif(.N)>.9)][]
data.dt <- merge(data.dt, obsmap.dt, by="obs")[, .(var,y,value)]

#DOES NOT WORK
tot.dt <- merge(CJ(var=unique(data.dt[["var"]]), y=c(0,1)), obsmap.dt[, .(cnt=.N), y], by="y")[, .(var,y,cnt)]
setkey(tot.dt, var, y)

tiles <- seq(0,100,10)
data.dt[, as.list(quantile(c(rep(0,tot.dt[.(var,y)][["cnt"]]-.N),value), 
    probs=tiles/100, names=FALSE, type=3)), by=.(var,y)]

#WORKS
setkey(setnames(tot.dt, c("var1","y1","cnt")), var1, y1)

data.dt[, as.list(quantile(c(rep(0,tot.dt[.(var,y)][["cnt"]]-.N),value), 
    probs=tiles/100, names=FALSE, type=3)), by=.(var,y)]

这个问题与Keyed lookup on data.table without 'with'有关。最大的区别是电话的范围。没有重命名是否可以这样做?

0 个答案:

没有答案