【问题标题】:Is it possible to call a function inside a data.table operation?是否可以在 data.table 操作中调用函数?
【发布时间】: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


【解决方案1】:

您似乎对自己在做什么感到有些困惑。在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)]

【讨论】:

  • 我认为这需要data = .SD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2012-08-30
  • 2021-07-04
相关资源
最近更新 更多