如何在R中编写将字符向量转换为日期向量的函数?

时间:2014-11-19 15:50:28

标签: r

这似乎是一个足够简单的函数来编写,但我认为我误解了正式参数的要求/ R如何解析和评估函数。

我尝试编写一个函数,将"%m/%d/%Y"(并且属于data.frame df)格式的任何字符向量转换为日期向量,并将其格式化为{{ 1}},如下:

"%m/%d/%Y"

我在想......

dateformat <- function(x) {
  df$x <- (format(as.Date(df$x, format = "%m/%d/%Y"), "%m/%d/%Y"))
}

...只需将dateformat(a) 作为"a"的实际参数并将其插入函数中,从而解析为:

x

但是,运行 df$a <- (format(as.Date(df$a, format = "%m/%d/%Y"), "%m/%d/%Y")) 时出现以下错误:

dateformat(a)

有人可以解释为什么我对正式/实际参数和/或R函数解析/评估的理解不正确?谢谢。

更新

当然,对于我想要转换为日期的所有变量(例如Error in as.Date.default(df$x, format = "%m/%d/%Y") : do not know how to convert 'df$x' to class “Date” df$adf$b),我只能写

df$c

df$a <- (format(as.Date(df$a, format = "%m/%d/%Y"), "%m/%d/%Y"))

df$b <- (format(as.Date(df$b, format = "%m/%d/%Y"), "%m/%d/%Y"))

但是我希望通过提供一个更通用的功能来提高我的编码技能,我可以用它来提供变量向量。例如,如果我有df$c <- (format(as.Date(df$c, format = "%m/%d/%Y"), "%m/%d/%Y"))df$a,我想要转换为日期变量的所有字符变量怎么办?在我编写了一个合适的函数之后,我想也许就这样运行它:

df$z

1 个答案:

答案 0 :(得分:1)

首先,format(...)函数返回一个字符向量,而不是日期,所以如果x是一个字符串,

format(as.Date(x, format = "%m/%d/%Y"), "%m/%d/%Y")

x转换为日期,然后转换回字符,如:

result <- format(as.Date("01/03/2014", format = "%m/%d/%Y"), "%m/%d/%Y")
result
# [1] "01/03/2014"
class(result)
# [1] "character"

其次,在函数中引用表达式LHS上的对象(如df)会导致R在函数范围内创建该对象。

a <- 2
f <- function(x) a <- x
f(3)
a
# [1] 2

在这里,我们将变量a设置为2。然后在函数中我们在函数范围内创建一个新变量a,将其设置为x(3),并在函数返回时将其销毁。因此,在全球环境中,a仍为2

如果您坚持使用dateformat(...)功能,这应该可行:

df <- data.frame(a=paste("01",1:10,"2014",sep="/"),
                 b=paste("02",11:20,"2014",sep="/"),
                 c=paste("03",21:30,"2014",sep="/"))

dateformat <- function(x) as.Date(df[[x]], format = "%m/%d/%Y")
for (n in letters[1:3]) df[[n]] <- dateformat(n)
sapply(df,class)
#      a      b      c 
# "Date" "Date" "Date" 

但这会更有效:

df <- as.data.frame(lapply(df,as.Date,format="%m/%d/%Y"))