在dplyr中保存管道之间的输出

时间:2018-04-19 16:15:10

标签: r dplyr pipe

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

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

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

3 个答案:

答案 0 :(得分:9)

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

O(m log n)

答案 1 :(得分:2)

不确定为什么会需要它。但正如@Frank建议的一个选项是使用%T>%包中的tee operator运算符(magrittr)和assign函数来存储中间值。

在下面的代码中,SummaryVal将有summary的{​​{1}}信息,cars将保留MyValue之后的中间值。

mutate

<强>更新: 正如@Renu正确指出的那样,即使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 也可以如下工作:

%>%

答案 2 :(得分:0)

列表和功能是可行的方法。使调试变得简单并且仍然可读。这是一个小例子。您需要在函数中包含一些错误处理,以确保您提供的数据符合您的预期等。函数将返回包含结果的列表。如果你想要单独的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)