[英]Optimize R chains (magrittr)
我想將(鏈式)magrittr對象放入循環中。 我怎樣才能做到這一點?
我將以虛擬操作/數據為例:
library(data.table)
library(magrittr)
# Dummy data modification
d <- mtcars %>%
setDT() %>%
.[, cylSQ := sqrt(cyl)] %>%
.[, carb3 := carb^3]
# Dummy loop
res <- list()
for(i in unique(d$gear)) {
res[[i]] <- d[gear == i] %>%
.[, lm(cylSQ ~ mpg + carb3 * wt)] %>%
.$fitted.values
}
是否可以不創建對象d
並直接將其傳遞給循環? 例如:
for(i in unique(.$gear)) {
res[[i]] <- .[gear == i] %>%
...
}
編輯:我不想用data.table
或dplyr
替換循環,只是對管道感到好奇。
您不介意在這里使用dplyr
而不是data.table
嗎? 如果沒有,請嘗試以下操作:
library(dplyr)
d <- mtcars %>%
mutate(cylSQ = sqrt(cyl), carb3 = carb^3) %>%
group_by(gear) %>%
do(fitted.values = lm(cylSQ ~ mpg + carb3 * wt, data = .)[["fitted.values"]])
這是一個粗略的解決方法,但是您可以在magrittr
包%$%
使用exposition運算符。
即:
mtcars %>%
filter(hp > 1) %$%
for(i in 1:ncol(.)) {
print(.[1,i])
}
[1] 21
[1] 6
[1] 160
[1] 110
[1] 3.9
[1] 2.62
[1] 16.46
[1] 0
[1] 1
[1] 4
[1] 4
我不是magrittr的從業者,所以它可能會得到改善,但至少可以起作用,並且應該是有效的。
as.data.table(mtcars
)[, cylSQ := sqrt(cyl)
][, carb3 := carb^3
][, lm(cylSQ ~ mpg + carb3 * wt)$fitted.values, by=gear
] %>%
split(by = "gear", keep.by = FALSE) %>%
lapply(unlist) %>%
lapply(unname) -> res
由於使用了新的split.data.table
因此需要1.9.7中的data.table,有關如何在各種平台上安裝的詳細信息,請參見安裝Wiki 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.