我想更改一些代碼以使用plyr而不是ddply,因爲我認爲在我的大型(> 1e6)數據集上它會更快。這裏設定的示例性數據:將代碼從ddply轉換爲plyr中的R
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)))
它執行鍼對LEN由ID DF的每個子集:測量一個LM,ROW和COL,提取係數。在我的大型數據集上,它需要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選擇是最好的所以再次感謝你。
的Tru'DF%>%GROUP_BY(ID,行,列)%>%做(as.data.frame.list(COEF(LM(測量〜LEN,數據=。))))' – akrun
很可愛,謝謝。所以我可以確認「做什麼」以及爲什麼需要「.list」。 – Pete900
其實谷歌會告訴我,不用擔心。再次感謝。 – Pete900