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

How to create a user generated function in R which converts all values in a column to date format?

这是我的数据集的一个非常小的子集:

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 纪元时间。我想将这些更改为常规的现代日期。我的实际数据集有很多表,其中有很多行和列需要转换。

因此,与其 运行 多行长代码,我想在 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 "+"

如果有任何帮助或建议,我将不胜感激:)

在函数中引用列名时必须使用 non-standard 评估 (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')