2016-08-26 4 views
1

Ich möchte (Ketten-) magritr Objekt in eine Schleife pipettieren. Wie kann ich das machen?
wird I dummy Operationen/Daten als Beispiel verwendet werden:Optimieren R Ketten (magritr)

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 
} 

ist möglich, es nicht d Objekt zu erzeugen und sie direkt auf Schleife zu Rohr? Zum Beispiel:

for(i in unique(.$gear)) { 
    res[[i]] <- .[gear == i] %>% 
    ... 
} 

Edit: Ich will nicht Schleife ersetzen mit data.table oder dplyr, einfach nur neugierig über Rohrleitungen.

+1

Ich könnte falsch liegen, ist nicht der Grund, warum es 'purrr' Paket? – zx8754

+0

@ zx8754 Ich habe noch nie davon gehört, weiß nicht, dass es das ist, was ich suche, aber es scheint immer noch sehr gut und sehenswert zu sein. Danke für den guten Vorschlag! – PoGibas

+1

'mtcars%>% setDT' geht gegen die dplyr-Grammatik/Philosophie von nicht ändern Eingabe, fyi. – Frank

Antwort

2

Dies ist ein bisschen skizzenhafte Arbeit, aber Sie können den Expositionsoperator im magrittr Paket %$% verwenden.

d.h .:

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

Ich bin nicht Praktiker magrittr so dass es wahrscheinlich verbessert werden könnte, aber zumindest funktioniert und sollten effizient sein.

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 

Aufgrund neuer split.data.table es in 1.9.7 data.table erfordert, siehe installation wiki für Details, wie auf verschiedenen Plattformen installieren.

3

Stört es dich nicht dplyr anstelle von data.table hier zu verwenden? Wenn nicht, versuchen Sie Folgendes:

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

Sieht wirklich gut aus. – PoGibas