【问题标题】:passing argument to dplyr slice将参数传递给 dplyr 切片
【发布时间】:2021-04-23 14:55:18
【问题描述】:

我想使用 slice 来获取大型 data.frame 上的最大值和位置(以获取日期),并且我想为多个变量执行此操作。所以,我正在编写一个自定义函数来传递几个变量作为参数,但它不起作用。

           mvar <- "WD"
          
           peak_max <- dataf%>%group_by(year=format(date,"%Y"))%>%
                   dplyr::slice(which.max(!!mvar))
          

我使用了summarise,但在传递参数时也失败了:

            peak_max <- dataf%>%group_by(year=format(date,"%Y"))%>%
                    dplyr::summarise(date=date[which.max(!!mvar)], wd=max(!!mvar))

我也尝试过使用 mvar

提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    看起来您使用的是旧方法来处理programming with dplyrEnquo()!! 不再使用。

    在没有数据的情况下很难确定您想要实现什么,但是,如果您直接传递变量(就像在 dplyr 管道中所做的那样,您可以在函数中包含它 {{ var }}。如果您是传递变量的字符串名称,您需要使用.data[[var]]:

    library(tidyverse)
    
    # pass variable directly
    my_func_var <- function(df, var){
      df %>% slice_max({{ var }})
    }
    
    iris %>% my_func_var(Sepal.Length)
    #>   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    #> 1          7.9         3.8          6.4           2 virginica
    
    # pass variable as string
    my_func_str <- function(df, var){
      df %>% slice_max(.data[[var]])
    }
    
    my_var <- "Sepal.Length"
    iris %>% my_func_str(my_var)
    #>   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    #> 1          7.9         3.8          6.4           2 virginica
    

    reprex package (v1.0.0) 于 2021-04-23 创建

    (我使用slice_max() 感觉更自然,但which.max() 似乎也可以)

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 2015-03-14
      • 2017-10-16
      • 2018-06-15
      • 1970-01-01
      • 2018-01-08
      • 2017-06-06
      相关资源
      最近更新 更多