是否可以使用magrittr在单个工作流程中创建两个数据框架?

时间:2015-02-01 15:31:46

标签: r dplyr magrittr

magrittr管道运营商入门,如果可以在一个流程中创建两个数据框,那就很奇怪了。例如,为绘图生成非聚合数据框,并为订购因子(aggregate ordering example)生成聚合数据框会很有帮助。

这是一个相当人为的例子,它说明了一个问题:

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&gt;%),这显然无效。

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:5)

您可以在管道中使用list(),然后在评估第一个data.frame之后连接agg。在这里,我只使用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"

答案 2 :(得分:3)

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