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。
This Works,thanks!但'cbind'似乎是一個昂貴的電話。有沒有更高效的方法,或者這是什麼'mutate'等人在罩下做的? – sabraham
添加基礎和data.table解決方案 –
添加新(1)。舊的(1)和(1a)現在是(1a)和(1b)。 –