优化 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.tabledplyr 替换循环,只是对管道感到好奇。

这是一个粗略的解决方法,但您可以使用 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"]])