【发布时间】:2014-08-04 16:17:24
【问题描述】:
我想从 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 计算结果为“闭包”。必须评估为原子向量或列表
【问题讨论】:
-
我认为如果您在 data.table 调用之外定义函数然后使用
dt[, fun(.SD), by=list(ID1,ID2,ID3)],它可能会起作用。当然,您需要使用setDT(dt)才能真正将其设为data.table。现在它是一个 data.frame。 -
但是速度的瓶颈是
nls。 data.table 对此无能为力。
标签: r data.table plyr