R data.table计算组中每个成员的子集向量的函数

时间:2015-06-26 03:26:26

标签: r data.table vectorization subset

我有一个与

非常相似的数据表
set.seed(1)

dt<-data.table(med=sample(letters,50,T),
    diag=sample(LETTERS[1:7],50,T),
    val=sample(1:100,50,F))

我想计算同一val的任何val大于diag的概率,并将其分配到表的新列,例如prob (我知道概率不一定是正常的。我对这种情况没问题。)

我可以用for循环来做到这一点:

for (i in 1:50){
    dg<-dt[i,diag]
    vl<-dt[i,val]
    dt$prob[i]<-pnorm(vl,
                      mean(dt[diag==dg,val]),
                      sd(dt[diag==dg,val]),
                      lower.tail = F)
}

但我的数据相当大(dt大约是800k行,diag上有2k级),所以我想进行矢量化而不是循环。

我试过

dt[,
   .(lapply(.SD,function(x) 
                pnorm(x[1],
                mean(x),
                sd(x),
                lower.tail = F))),
   by=diag,
   .SDcols="val"]

当然由diag分组只产生一个概率,因此没有多大用处。 我也试过

dt[,
   .(lapply(.SD,function(x) 
                pnorm(x[1],
                mean(x),
                sd(x),
                lower.tail = F))),
   by=.EACHI,
   .SDcols="val"]

但它会产生错误:

Error in `[.data.table`(dt, , .(lapply(.SD, function(x) pnorm(x[1], mean(x),  : 
  logicial error. i is not data.table, but mult='all' and 'by'=.EACHI

使用矢量化生成所需结果的代码是什么?

由于我正在习惯data.table,我更喜欢使用该软件包的解决方案,但我绝对对任何其他解决方案来源(plyr,dplyr等)开放

谢谢,

2 个答案:

答案 0 :(得分:3)

{ someName-1: "someDynamicValue", someName-2: "someDynamicValue", someName-3: "someDynamicValue" }

data.table

似乎符合您的要求:

dt[, prob2 := pnorm(val, mean(val), sd(val), lower.tail=FALSE), by=diag]

答案 1 :(得分:2)

这是一个ASCIIString解决方案:

dplyr