2015-02-01 3 views
3

Начало работы с операторами труб magrittr и было любопытно, если бы два кадра данных могли быть созданы в одном потоке. Например, было бы полезно создать неагрегированный кадр данных для построения графика и агрегированный кадр данных для коэффициентов заказа (aggregate ordering example).Возможно ли создать два кадра данных в одном рабочем потоке с помощью magrittr?

Вот довольно надуманный пример, который иллюстрирует вопрос:

library(dplyr) 
library(tidyr) 
library(magrittr) 
library(ggplot2) # msleep 

vore_count <- 
    na.exclude(msleep) %>% 
    group_by(vore, order) %>% 
    summarise(count = n()) %>% 
    ungroup() 

agg <- vore_count %>% 
    spread(vore, count) 

Может как vore_countиagg быть сгенерированы в том же потоке?

Я пробовал следующее (а также использовать% T>%), что явно не работает.

vore_count <- 
    na.exclude(msleep) %>% 
    group_by(vore, order) %>% 
    summarise(count = n()) %>% 
    ungroup() %>% 
     agg <- spread(vore, count) 
+0

Какие пакеты вы используете помимо 'magrittr'? Является ли 'распространение' UDF или это из какого-то другого пакета? – nrussell

+1

@Minnow '? Spread' от' tidyr' – akrun

+1

Где находится 'msleep'? –

ответ

5

Вы можете использовать list() в трубе затем сцепить agg после оценки первого data.frame. Здесь я просто использую mtcars. Результатом является именованный список из двух фреймов данных.

library(dplyr) 
library(tidyr) 

na.exclude(mtcars) %>% 
    group_by(cyl, disp) %>% 
    summarise(count = n()) %>% 
    ungroup %>% 
    list(cyl_count = .) %>% 
    c(list(agg = spread(.$cyl_count, cyl, count))) 

Если вы хотите назначить их для глобальной окружающей среды, вы можете добавить следующую строку в конец трубы

... %>% 
    list2env(globalenv()) 

ls(pattern = "agg|cyl_count") 
# [1] "agg"  "cyl_count" 
6

Побочное задание проще с pipeR.

library(pipeR) 
library(dplyr) 
library(ggplot2) 
library(tidyr) 
na.exclude(msleep) %>>% 
    group_by(vore, order) %>>% 
    summarise(count = n()) %>>% 
    ungroup() %>>% 
    (~ vore_count) %>>% 
    spread(vore, count)%>>% 
    (~ agg) 
3

Хотя я могу понять соблазн, ИМО только одно назначение должно быть выполнено из одного рабочего процесса/трубопровода. Это чище, легче читать и лучше практиковать. В каждом трубопроводе в идеале должна быть только одна цель. Один вход, один выход.

+0

Совет хорошо принят. Мне было любопытно, если кто-то порекомендовал бы против этого. Полагаю, вы бы построили эту функцию, если бы это была хорошая идея. – Minnow

+3

@Minnow было предложено несколько раз, но я не слишком счастлив, поощряя это. Также можно использовать комбинацию '% T>%' и 'assign', хотя вам нужно иметь ссылку на среду. Я думаю о том, чтобы облегчить доступ к среде. @AK_ IMO часто является лучшим ответом на руководство хорошей практикой. Но вы правы, точка взята. – Stefan

+0

Несомненно .... Но обычай здесь сделать это с комментарием –

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

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