【问题标题】:Save output between pipes in dplyr [duplicate]在dplyr中保存管道之间的输出[重复]
【发布时间】:2018-09-30 05:34:16
【问题描述】:

我正在编写一个带有多个管道的函数。我想在最后一个管道之前将一些步骤保存为 .tbl 或数据框。例如:a %>% b %>% c,我想保存步骤'c',但也想要步骤'b'

我知道一种选择是做两个管道,但我相信一定有更好的方法。

cars %>% mutate(kmh = dist/speed) %>% summary()

【问题讨论】:

  • 加载 magrittr 并使用 %T>%?我不清楚您所说的“保存”是什么意思/想要的结果是什么。
  • 汽车示例只是一个通用示例。在我的实际工作中,我有超过 500k 的天气观测(每 15mim),所以我想先按小时汇总并保存,然后按天汇总并保存,最后按月汇总。这些输出中的每一个都将用于不同的分析
  • 为什么要全部在一行?

标签: r dplyr pipe


【解决方案1】:

感谢您的帮助。我found 使用大括号{} 和 ->> 的更好解决方案。见下文

   c = cars %>% mutate(var1 = dist*speed)%>%
   {. ->> b } %>%   #here is save
   summary()
   c
   head(b)

【讨论】:

  • 确实比 magrittr 容易
【解决方案2】:

不知道为什么需要它。但正如@Frank 建议的那样,一种选择是使用magrittr 包中的%T>% 运算符(tee operator)和assign 函数来存储中间值。

在下面的代码中,SummaryVal 将具有carssummary 信息,MyValue 将保存mutate 之后的中间值。

library(tidyverse)
library(magrittr)

SummaryVal <- cars %>% mutate(kmh = dist/speed) %T>% 
              assign("MyValue",.,envir = .GlobalEnv) %>% 
              summary()

head(MyValue)
#   speed dist       kmh
# 1     4    2 0.5000000
# 2     4   10 2.5000000
# 3     7    4 0.5714286
# 4     7   22 3.1428571
# 5     8   16 2.0000000
# 6     9   10 1.1111111

SummaryVal
#    speed           dist             kmh       
# Min.   : 4.0   Min.   :  2.00   Min.   :0.500  
# 1st Qu.:12.0   1st Qu.: 26.00   1st Qu.:1.921  
# Median :15.0   Median : 36.00   Median :2.523  
# Mean   :15.4   Mean   : 42.98   Mean   :2.632  
# 3rd Qu.:19.0   3rd Qu.: 56.00   3rd Qu.:3.186  
# Max.   :25.0   Max.   :120.00   Max.   :5.714 

更新: 正如@Renu 正确指出的那样,即使%&gt;% 也将按以下方式工作:

SummaryVal <- cars %>% mutate(kmh = dist/speed) %>% 
              assign("MyValue",.,envir = .GlobalEnv) %>% 
              summary()

【讨论】:

  • 很好的解决方案。在这种情况下,%T&gt;% 是不必要的,因为即使您只使用 %&gt;%,结果也是一样的
  • @Renu 有效点。确实会奏效。虽然不知道为什么它作为assign 没有返回任何东西。牢记这一点,我认为%T&gt;% 将是一个不错的选择。
  • 确实如此。见a &lt;- assign('b', 4)。与a &lt;- b &lt;- 4的概念相同
  • @Renu 是的。如果您只是在命令行上运行assign('test, 2),则不会打印任何内容。甚至文档也没有说明返回值,但它返回了。
【解决方案3】:

列表和函数是要走的路。使调试变得容易并且仍然可读。这是一个小例子。您将需要在函数中包含一些错误处理,以确保您提供给它的数据是您所期望的等。该函数将返回一个包含结果的列表。以防万一您想要单独的 data.frames 而不是大列表,最后一行代码从列表中提取所有 data.frame 作为单独的 data.frames。

library(dplyr)

# create a function
my_summaries <- function(x){
  # error handling goes here
  my_mutate <- x %>% mutate(kmh = dist/speed)
  my_summary <- my_mutate %>% summary()
  list(mutate = my_mutate, summary = my_summary)
}

my_data <- my_summaries(cars)

str(my_data)
List of 2
 $ mutate :'data.frame':    50 obs. of  3 variables:
  ..$ speed: num [1:50] 4 4 7 7 8 9 10 10 10 11 ...
  ..$ dist : num [1:50] 2 10 4 22 16 10 18 26 34 17 ...
  ..$ kmh  : num [1:50] 0.5 2.5 0.571 3.143 2 ...
 $ summary: 'table' chr [1:6, 1:3] "Min.   : 4.0  " "1st Qu.:12.0  " "Median :15.0  " "Mean   :15.4  " ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:6] "" "" "" "" ...
  .. ..$ : chr [1:3] "    speed" "     dist" "     kmh"


# Unlist list of data.frames
list2env(my_data ,.GlobalEnv)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多