首页 文章

在dplyr中保存管道之间的输出[重复]

提问于
浏览
2

这个问题在这里已有答案:

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

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

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

3 回答

  • 0

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

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

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

    在下面的代码中, SummaryValcars 的信息 summaryMyValue 将保持 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
    

    UPDATED: 正如@Renu正确指出的那样 %>% 将如下工作:

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

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

相关问题