如何在 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')
这是我的数据集的一个非常小的子集:
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')