2016-08-26 3 views
1

Я хотел бы подключить (цепочку) объект magrittr в цикл. Как я могу это сделать?
я буду использовать фиктивные операции/данные в качестве примера:Оптимизация R-цепей (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] %>% 
    ... 
} 

Edit: Я не хочу, чтобы заменить петлю data.table или dplyr, просто любопытно трубопроводов.

+1

Возможно, я ошибаюсь, не является ли причиной наличие пакета 'purrr'? – zx8754

+0

@ zx8754 Я не слышал об этом раньше, не знаю, что это то, что я ищу, но все же кажется, что это очень хорошо и стоит посмотреть. Спасибо за хорошее предложение! – PoGibas

+1

'mtcars%>% setDT' идет вразрез с грамматикой dplyr/философией не изменяющего ввода, fyi. – Frank

ответ

2

Это немного отрывочная работа, но вы можете использовать оператора экспозиции в пакете 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 
1

Я не 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 она требует data.table в 1.9.7, см installation wiki подробно, как установить на различных платформах.

3

Не против использования 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"]]) 
+0

Выглядит очень хорошо. – PoGibas