簡體   English   中英

是否可以使用magrittr在單個工作流程中創建兩個數據框架?

[英]Is is possible to create two data frames in a single work flow with magrittr?

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

使用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)

您可以在管道中使用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"

雖然我能理解這種誘惑,但IMO只應從一個工作流/管道中進行一項任務。 它更清潔,更易於閱讀和更好的練習。 理想情況下,每個管道只應有一個目的。 一個輸入,一個輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM