【问题标题】:Calling user defined functions from dplyr::mutate从 dplyr::mutate 调用用户定义的函数
【发布时间】:2020-04-28 16:28:07
【问题描述】:

我正在从事一个涉及许多不同小标题的项目,所有这些小标题都有一个格式为 YYYYMM 的 period 变量。下面是我所有小标题的示例:

tibble_1 <- tibble::tibble(
    period = c(201901, 201912, 201902, 201903),
    var_1 = rnorm(4),
    var_2 = rnorm(4)
)

但对于某些操作(即时间序列图),使用实际的 Date 变量会更容易。所以我使用 mutate 将 period 变量转换为如下日期:

tibble_1 %>% 
  dplyr::mutate(
    date = lubridate::ymd(stringr::str_c(period, "01"))
  )

因为我会经常这样做,而且日期转换不是我在调用 mutate 时要做的唯一更改,所以我想要一个用户定义的函数,我可以在 mutate 中调用它称呼。这是我的功能:

period_to_date <- function() {
  lubridate::ymd(stringr::str_c(period, "01"))
}

我稍后会这样称呼:

tibble_1 %>% 
  dplyr::mutate(
    date = period_to_date()
  )

问题是,R 找不到句号对象(它本身并不是真正的对象,而是小标题的一部分)。

stri_c 中的错误(...,sep = sep,collapse = collapse,ignore_null = TRUE):找不到对象“句点”

我很确定我需要定义一个数据掩码,以便执行 period_to_date 的环境可以在它的父环境中查找对象(它应该始终是调用者环境,因为包含 period 变量的小标题是并不总是一样),但我似乎不知道该怎么做。

【问题讨论】:

    标签: r dplyr tidyeval


    【解决方案1】:

    该函数不知道您要修改哪个对象。在函数中传递period 对象并像这样使用它:

    period_to_date <- function(period) {
      lubridate::ymd(stringr::str_c(period, "01"))
      #Can also use
      #as.Date(paste0(period,"01"), "%Y%m%d")
    }
    
    tibble_1 %>% 
      dplyr::mutate(date = period_to_date(period))
    
    #  period   var_1  var_2 date      
    #   <dbl>   <dbl>  <dbl> <date>    
    #1 201901 -0.476  -0.456 2019-01-01
    #2 201912 -0.645   1.45  2019-12-01
    #3 201902 -0.0939 -0.982 2019-02-01
    #4 201903  0.410   0.954 2019-03-01
    

    【讨论】:

    • 谢谢罗纳克!!有用。我以为 R 会自动在调用者环境中寻找它。我猜我错了。
    【解决方案2】:

    考虑将列名作为参数传递给您的函数:

    library(dplyr)
    
    
    period_to_date <- function(x) {
      lubridate::ymd(stringr::str_c(x, "01"))
    }
    
    df <- data.frame(x = 1:3, period = c('201903', '202001', '201511'))
    
    df %>% mutate(p2 = period_to_date(period))
    #>   x period         p2
    #> 1 1 201903 2019-03-01
    #> 2 2 202001 2020-01-01
    #> 3 3 201511 2015-11-01
    

    reprex package (v0.3.0) 于 2020 年 1 月 10 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多