簡體   English   中英

優化R鏈(magrittr)

[英]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.tabledplyr替換循環,只是對管道感到好奇。

您不介意在這里使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM