是否可以在data.table操作中调用函数?

时间:2014-08-04 16:17:25

标签: r data.table plyr

我希望通过nls模型中的小组更快速地运行模拟。 df是一个数据框

一些数据(df):

ID1 ID2 ID3 x   x
9   aa  bb  4   0.073
9   aa  bb  40  0.033
9   aa  bb  100 0.024
9   aa  bb  400 0.017
7   bb  bb  4   0.142
7   bb  bb  40  0.072
7   bb  bb  100 0.059
7   bb  bb  400 0.037
9   bb  bb  4   0.349
9   bb  bb  40  0.235
9   bb  bb  100 0.192
9   bb  bb  400 0.135

这适用于plyr:

library(plyr)

form <- formula(y ~ m * x^(-n))
s <- list(m=1, n=0.5)
x.range <- seq(1, 1000, length.out=30000)

sim.df <- ddply(df, 
               c("ID1","ID2","ID3"), 
               function(a) {
                 m1 <- nls(form, data=a, start=s)
                 y.pred <- predict(m1, newdata=data.frame(x=x.range))
                 data.frame(x=x.range, y=y.pred)
               })

有没有办法用data.table做类似的事情?我尝试了以下内容,但语法可能过于灵感来自plyr ......

library(data.table)
dt <- data.frame(df)

sim.dt <- dt[,
              function(a) {
                m1 <- nls(form, data=a, start=s)
                y.pred <- predict(m1, newdata=data.frame(x=x.range))
                data.frame(x=x.range, y=y.pred)
              },
              by=list(ID1,ID2,ID3)
              ]

我得到了这个错误: j评估为&#39;关闭&#39;。必须评估为原子矢量或列表

1 个答案:

答案 0 :(得分:3)

你似乎对你正在做的事情感到有点困惑。在data.table中,第二个参数是一个表达式(与ddply的第三个参数不同,它是一个函数) - 现在你只是给它一个匿名函数。

OP中没有可重现的数据可供测试,但我猜您只是想:

dt[, {
       m1 <- nls(form, data=.SD, start=s)
       y.pred <- predict(m1, newdata=data.frame(x=x.range))
       list(x=x.range, y=y.pred)
     },
   by=list(ID1,ID2,ID3)]