优化 R 链 (magrittr)
Optimize R chains (magrittr)
我想将(链)magrittr 对象传送到循环中。我该怎么做?
我将使用虚拟 operations/data 作为示例:
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
替换循环,只是对管道感到好奇。
这是一个粗略的解决方法,但您可以使用 magrittr
包 %$%
中的说明运算符。
即:
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,请参阅 installation wiki 了解如何在各种平台上安装的详细信息。
您不介意在这里使用 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 对象传送到循环中。我该怎么做?
我将使用虚拟 operations/data 作为示例:
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
替换循环,只是对管道感到好奇。
这是一个粗略的解决方法,但您可以使用 magrittr
包 %$%
中的说明运算符。
即:
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,请参阅 installation wiki 了解如何在各种平台上安装的详细信息。
您不介意在这里使用 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"]])