2015-10-12 44 views
2

我想更改一些代碼以使用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選擇是最好的所以再次感謝你。

+1

的Tru'DF%>%GROUP_BY(ID,行,列)%>%做(as.data.frame.list(COEF(LM(測量〜LEN,數據=。))))' – akrun

+0

很可愛,謝謝。所以我可以確認「做什麼」以及爲什麼需要「.list」。 – Pete900

+0

其實谷歌會告訴我,不用擔心。再次感謝。 – Pete900

回答

3

我們修改OP的最後一段代碼以獲得預期的輸出。我們用變量'ID','Row'和'Col',do,lm使用變量'Meas'和'len'進行分組,提取係數coef,將其轉換爲list,然後再轉換爲data.frameas.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', '行' 和 '上校',做lm,提取係數,並轉換到list,這樣我們可以得到兩個新的列。

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

這是一個答案,但它接近代碼唯一的答案。這將是很好的解釋答案。 – Elin

+0

@Elin添加了一些文字。 – akrun