我正在编写一个包含多个管道的函数。我想在最后一个管道之前将一些步骤保存为.tbl或数据框。例如:a %>% b %>% c
,我想保存步骤'c'
,但也想要步骤'b'
。
我知道一个选择是做两个管道,但我相信必须有更好的方法。
cars %>% mutate(kmh = dist/speed) %>% summary()
答案 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)