如何在R中创建用户生成的函数,以将列中的所有值转换为日期格式?

问题描述

这是我的数据集的一小部分:

db_country <- tibble(country = c("Argentina","Australia","Austria"),region = c("Americas","Asia","Europe"),start_date = as.numeric(18487,18487,18487))

# A tibble: 3 x 3
  country   region   start_date
  <chr>     <chr>         <dbl>
1 Argentina Americas      18487
2 Australia Asia          18487
3 Austria   Europe        18487

您可以看到start_date列的值是Unix Epoch时间。我想将它们更改为常规的现代日期。我的实际数据集有很多表,其中有很多行和列,需要转换。

因此,我不想运行多行代码,而是想在R中创建自己的函数,该函数执行相同的操作,但字符数减少。通常,我会做这样的事情:

db_country <- db_country %>% mutate(start_date = as_date(start_date))

由于我要创建快捷键功能,因此尝试了以下操作,但它们给了我错误

(我确实装载了tidyverse和lubridate包)

mydate1 <- function(dataset,column) {
  dataset <- dataset %>% mutate(column = as_date(column))
}

mydate1(db_country,start_date)

# Error: Problem with `mutate()` input `column`.
# x error in evaluating the argument 'x' in selecting a method for function 'as_date':
#  object 'start_date' not found
# i Input `column` is `as_date(column)
mydate2 <- function(dataset,column) {
  dataset$column <- as_date(dataset,dataset$column)
}

mydate2(db_country,start_date)

# Error in as.Date.default(x,...) : 
#  do not kNow how to convert 'x' to class “Date” 
mydate3 <- function(dataset,column) {
  dataset$column <- as.Date.numeric(dataset,dataset$column)

mydate3(db_country,start_date)

# Error in as.Date(origin,...) + x : 
#  non-numeric argument to binary operator
# In addition: Warning messages:
# 1: UnkNown or uninitialised column: `column`. 
# 2: In as.Date.numeric(dataset,dataset$column) :
#   Incompatible methods ("+.Date","Ops.data.frame") for "+"

真的很感谢您的帮助或建议:)

解决方法

在引用函数中的列名称时必须使用非标准评估(NSE)。

如果要在函数中传递未加引号的名称,请使用{{}}

library(dplyr)
library(lubridate)
library(rlang)

mydate1 <- function(dataset,column) {
  dataset %>% mutate({{column}} := as_date({{column}}))
}

mydate1(db_country,start_date)
# A tibble: 3 x 3
#  country   region   start_date
#  <chr>     <chr>    <date>    
#1 Argentina Americas 2020-08-13
#2 Australia Asia     2020-08-13
#3 Austria   Europe   2020-08-13

如果要传递带引号的名称,请将函数更改为:

mydate1 <- function(dataset,column) {
  dataset %>% mutate(!!column := as_date(.data[[column]]))
}

mydate1(db_country,'start_date')