我有一个与
非常相似的数据表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等)开放
谢谢,
答案 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