2015-03-07 3 views
7

Я хотел бы смешать data.table pipelining с конвейером magrittr. Я могу перейти от data.table к%>%, но я не могу понять, как вернуться к [] [] конвейеру стиля data.table.Как построить трубопровод от data.table до magrittr и обратно к data.table

Вот пример:

> 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 
> 

Как я могу вернуться к [] [] после того, как%>%?

Я знаю, что этот конкретный пример можно полностью переписать с помощью [] и без%>%, но я не заинтересован в этом каждый раз. Я хотел бы иметь возможность писать [] []%>% [] [] шаблоны.

+0

Обильные круглые скобки? (Я не знаю magrittr.) – Frank

+1

Есть ли причина, по которой вы не будете делать 'tbl [,. (. N, mean (y)), by = grp] [order (-N)]%>% head (n = 3)%>%. [, N: = NULL]%>%. [, plot (grp, V2)] '? – cocquemas

+0

@hfty b/c, тогда я вынужден набирать 6 дополнительных (и в основном не алфавитно-цифровых) символов для каждого следующего шага в конвейере. –

ответ

0

Вы не можете. [ имеет higher precedence, чем %any%, поэтому он всегда будет оценен первым.

2

Вы можете сделать

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

преобразовать результат конвейера data.table, например, для хорошо печати результатов - в data.table пути. Но, к сожалению, вы не можете сделать что-то вроде

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

Интересно, если эта функция может быть добавлена ​​в будущих версиях data.table - возможно через новый синтаксис (для преодоления ограничения порядка старшинства, как «[» выполняется до «<»).

1

Оба предыдущих ответа не учитывают вашу способность указывать, в некоторой степени, приоритет. Вы можете сделать это повысит старшинства %>% части кода, заключая его в {} с:

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

Не очень, но это работает:

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

Цените это, но я ищу довольно. Основная проблема здесь заключается в том, как перемещение курсора назад вам нужно будет делать, когда ваш ум хочет перейти к следующему шагу в конвейере. –

+0

Признаюсь, я пришел к этому вопросу, ища красивый способ сделать это сам! – jbowman

 Смежные вопросы

  • Нет связанных вопросов^_^