我希望通过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;。必须评估为原子矢量或列表
答案 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)]