3

开始使用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)
4

3 回答 3

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)
于 2015-02-01T18:26:10.903 回答
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"
于 2015-02-01T16:56:35.080 回答
3

虽然我能理解这种诱惑,但 IMO 只能从一个工作流/管道中完成一项任务。它更干净、更容易阅读和更好的练习。理想情况下,每个管道应该只有一个目的。一个输入,一个输出。

于 2015-02-01T21:22:43.693 回答