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

在R中将代码从ddply转换为plyr,r,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,

我想修改一下我的代码,使用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)

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

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

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

Tru
df%>%groupby(ID,Row,Col)%>%do(as.data.frame.list(coef(lm(Meas~len,data=))))
很好,谢谢。所以我可以确认“做”是什么,为什么我需要“.list”。事实上谷歌会告诉我,不用担心。再次感谢。请看一下
broom
软件包。这可以为您从
lm
中提取相关信息。对于未来的读者,我想指出,在plyr版本中去掉引号是很重要的。它们没有被用作字符串。这是一个答案,但它接近于一个纯代码答案。“最好解释一下答案。”埃林补充了一些文字。
res2 <- df %>% group_by("ID", "Row", "Col") %>% (function(x) coefficients(lm(Meas~len,x))) %>%
  as.data.frame()
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
df %>% 
  group_by(ID, Row, Col) %>%
  do(as.data.frame.list(coef(lm(Meas~len, data=.))))
library(data.table)
setDT(df)[, as.list(coef(lm(Meas~len))), .(ID, Row, Col)]