2016-01-29 22 views
0

我想在每個組中擬合一個模型後找到觀測殘差。我還以爲代碼看起來像在group_中擬合一個模型後對觀測值進行殘差化處理

library(dplyr) 
df %>% 
group_by(group) %>% 
    do(residual=resid(lm(y~x, data=.))) %>% 
ungroup() 

但這種崩潰df和葉沒有x變量的痕跡。我要的是一個數據幀回報是一樣的東西

group |y| x| residual 

回答

3

1)dplyr爲了舉例,這個使用隨R.我注意到下面的代碼扼流圈公式iris數據幀如果我們去掉雙引號,但如果如式作爲字符串傳遞它的工作原理確定:

iris %>% 
group_by(Species) %>% 
    do(mutate(., resid = resid(lm("Sepal.Length ~ Sepal.Width", .)))) %>% 
ungroup() 

1A)這樣的變化同樣適用,即使沒有字符串公式:

iris %>% 
group_by(Species) %>% 
    do(cbind(., resid = resid(lm(Sepal.Length ~ Sepal.Width, .)))) %>% 
ungroup() 

1B)這種變化也可以工作:

iris %>% 
group_by(Species) %>% 
    do(transform(., resid = resid(lm(Sepal.Length ~ Sepal.Width, .)))) %>% 
ungroup() 

2)我們也可以考慮不使用dplyr和公正的基礎R這樣的基礎R:

f <- function(ix) resid(lm(Sepal.Length ~ Sepal.Width, iris, subset = ix)) 
transform(iris, resid = ave(seq_along(Species), Species, FUN = f)) 

3)data.table如果速度值得關注,你可能需要嘗試使用data.table,這通常是最快的方法,而且相當緊湊重新:

library(data.table) 

dt <- as.data.table(iris) 
dt[, resid := resid(lm(Sepal.Length ~ Sepal.Width, .SD)), by = Species] 

3a)的有趣的(1)與輸入data.table和實際式(未字符串)的工作原理此變化。此外,不需要do()

data.table(iris) %>% 
group_by(Species) %>% 
    mutate(resid = resid(lm(Sepal.Length ~ Sepal.Width, .))) %>% 
ungroup() 

注:我已經加入dplyr issue 1648

+0

This Works,thanks!但'cbind'似乎是一個昂貴的電話。有沒有更高效的方法,或者這是什麼'mutate'等人在罩下做的? – sabraham

+1

添加基礎和data.table解決方案 –

+1

添加新(1)。舊的(1)和(1a)現在是(1a)和(1b)。 –

相關問題