2015-03-07 10 views
7

Chciałbym połączyć pipelineing data.table z potrójnym pipeliningiem. Mogę przejść z data.table do%>%, ale nie mogę wymyślić, jak wrócić do [] [] data.table stylu pipelining.Jak zbudować potok z data.table na magrittr iz powrotem na data.table

Oto przykład:

> tbl = data.table(grp=c(1,1,1,2,2,2,3,3,3,4,4), y=rnorm(11)) 
> tbl 
    grp  y 
1: 1 0.08150 
2: 1 1.51330 
3: 1 -0.26154 
4: 2 -0.12746 
5: 2 0.10747 
6: 2 0.16502 
7: 3 0.54139 
8: 3 -0.04194 
9: 3 0.02373 
10: 4 2.00756 
11: 4 1.05523 
> tbl[, .(.N, mean(y)), by=grp][order(-N)] %>% head(n=3) %>% .[, N := NULL] 
    grp  V2 
1: 1 0.44442 
2: 2 0.04834 
3: 3 0.17439 
> tbl[, .(.N, mean(y)), by=grp][order(-N)] %>% head(n=3) %>% .[, N := NULL][, plot(grp, V2)] 
Error in `[.data.table`(., .[, `:=`(N, NULL)], , plot(grp, V2)) : 
    'by' or 'keyby' is supplied but not j 
Calls: %>% ... freduce -> withVisible -> <Anonymous> -> [ -> [.data.table 
> 

Jak mogę wrócić do [] [] po%>%?

Wiem, że ten konkretny przykład można przepisać całkowicie za pomocą [] i bez%>%, ale nie jestem zainteresowany robieniem tego za każdym razem. Chciałbym mieć sposób na napisanie wzorów [] []%>% [] [].

+0

Obszerne nawiasy? (Nie wiem magrittr.) – Frank

+1

Czy istnieje powód, dla którego nie zrobisz 'tbl [,. (. N, mean (y)), przez = grp] [order (-N)]%>% head (n = 3)%>%. [, N: = NULL]%>%. [, plot (grp, V2)] '? – cocquemas

+0

@ hfty b/c następnie jestem zmuszony do wpisania 6 dodatkowych (i najczęściej niealfanumerycznych) znaków dla każdego kolejnego etapu w potoku. –

Odpowiedz

2

Można zrobić

`tbl %>% filter(y>0) %>% data.table()` 

przekonwertować wynik rurociągu do data.table, na przykład, za ładnie drukuje wyniki - w data.table sposób. Ale, niestety, nie można zrobić coś takiego

`tbl %>% filter(y>0) %>% data.table() [, mean(y), by=group] 

Zastanawiam się, czy ta funkcjonalność może być dodana do przyszłych wersjach data.table - być może dzięki nowej składni (aby przezwyciężyć ograniczenia priorytecie, jako „[” jest wykonywana przed "<").

1

Obie poprzednie odpowiedzi pomijają Twoją zdolność do określenia, w pewnym stopniu, pierwszeństwa. Można to zrobić przez zarozumiały pierwszeństwo w %>% części kodu, umieszczając go w {} s:

x <- data.frame(a=1:5, b=6:10) 
{x %>% subset(a<4) %>% data.table()}[, mean(b)] 

Nie dość, ale to działa:

> {x %>% subset(a<4) %>% data.table()} [, mean(b)] 
[1] 7 
+0

Doceniam to, ale szukam ładnego. Głównym problemem jest to, ile ruchów kursora do tyłu musiałbyś wykonać, kiedy twój umysł chce przejść do następnego etapu. –

+0

Przyznaję, że przyszedłem na to pytanie, szukając całkiem niezłego sposobu robienia tego samemu! – jbowman