这似乎是一个足够简单的函数来编写,但我认为我误解了正式参数的要求/ 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$a
,df$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
答案 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"))