问题描述
这是我的数据集的一小部分:
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')