r - 在 R 中将代码从 ddply 转换为 plyr

标签 r plyr

我想更改一些代码以使用 plyr 而不是 ddply,因为我认为它在我的大型(>1e6)数据集上会更快。这是一个示例数据集:

ID <- rep(1:3, each=6)
Row <- rep(1, each=18) 
Col <- rep(rep(1:2, each=3), times=3)
Meas <- rnorm(18,3,1)
len <- rep(1:3, times=6)

df <- data.frame(ID, Row, Col, Meas, len)

我通常使用的代码是这样的:

res <- ddply(df, c("ID", "Row", "Col"), function(x) coefficients(lm(Meas~len,x)))

它通过 ID、Row 和 Col 对 df 的每个子集执行 lm 的 Meas 与 len 的比较,提取系数。在我的大型数据集上,需要 30 秒(我知道这不是世界末日)。当我尝试 plyr 时:

res2 <- df %>% group_by("ID", "Row", "Col") %>% (function(x) coefficients(lm(Meas~len,x))) %>%
  as.data.frame()

我只得到一个截距和梯度。我读过这篇文章( extracting p values from multiple linear regression (lm) inside of a ddply function using spatial data ),它给了我这样的尝试:

res3 <- df %>% group_by("ID", "Row", "Col") %>%
  do({model=lm(Meas~len, data=.)
  data.frame(tidy(model),
             glance(model))})

但还是没有运气。我确信我错过了一些简单的事情。

更新:

出于对在大型数据集上运行类似操作的任何人的兴趣:

system.time(
lres <- ddply(I, c("ERF", "Wafer", "Row", "Col"), function(x) coefficients(lm(Rds.on.fwd~Length,x)))
)

user  system elapsed 
  25.80    0.06   26.02

system.time(
  lres2 <- I %>% group_by(ERF, Wafer, Row, Col) %>% do(
    as.data.frame.list(coef(lm(Rds.on.fwd~Length, data=.))))
  )

user  system elapsed 
  43.12    0.25   44.02 

system.time(
lres3 <- setDT(I)[, as.list(coef(lm(Rds.on.fwd~Length))), .(ERF,Wafer, Row, Col)]
)

user  system elapsed 
  19.77    0.05   19.91

所以实际上@akrun data.table 选项是最好的,所以再次感谢您。

最佳答案

我们修改OP的最后一段代码以获得预期的输出。我们按变量“ID”、“Row”和“Col”进行分组,使用变量“Meas”和“len”do lm,使用提取系数code>coef,将其转换为 list,然后转换为 data.frame (as.data.frame.list)创建两个新列(“截距”和“斜率”)。

df %>% 
  group_by(ID, Row, Col) %>%
  do(as.data.frame.list(coef(lm(Meas~len, data=.))))

或者使用data.table,我们将'data.frame'转换为'data.table,按'ID','Row'和'Col'分组,执行 lm,提取系数,并转换为列表,以便我们获得两个新列。

library(data.table)
setDT(df)[, as.list(coef(lm(Meas~len))), .(ID, Row, Col)]

关于r - 在 R 中将代码从 ddply 转换为 plyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080000/

相关文章:

r - 如何将变量的值分配给 plyr 中的列名?

r - 将行与列匹配并计算相同的出现次数 R

在R中从宽到长 reshape 数据框

R -- 按组将日期范围扩展到面板数据

r - 带有完整饼图的多个ggplot饼图

reshape R 中的日期列

r - 在具有重复观察的行之间生成精确加权平均值

R中的子集回归

r - 如何在对角线内的 block 中创建一个带有零的矩阵?