我有一个函数,它接受一个Date对象并返回一个。但是,当我使用mapply函数将函数应用于data.frame列时,我遇到了问题:我没有像预期的那样得到Date-objects,而是数字。知道如何将它们转换为Date对象吗?另外,我会对这里发生的事情感兴趣。非常感谢帮助!
最小例子:
#Define simple function that takes a date-object and returns a date-object
add_day <- function(dat) {return(dat + 1)}
#Set up data.frame with two date-object entries in one column
df <- data.frame(Col_A = c(as.Date("01/01/00", "%m/%d/%y"), as.Date("05/02/11", "%m/%d/%y")))
#That is the desired result: give a date-object to the function, get one back
add_day(df[1, "Col_A"]) #Returns [1] "2000-01-02"
add_day(df[2, "Col_A"]) #Returns [1] "2011-05-03"
#Why does it not work here? What do I get back?
mapply(add_day, df[, "Col_A"]) #Returns [1] 10958 15097; Why? What is that?
答案 0 :(得分:14)
您的函数 返回“日期”,而不是您习惯的格式。日期在内部存储为[某个固定日期]后的天数。 (我不记得我的头顶哪一个,并且因具体格式而略有不同。)
如果您将mapply
电话打包在as.Date
,您会看到预期的输出。
要了解此处发生了什么,请考虑mapply
正在使用sapply
。例如:
sapply(df[,1],add_day)
[1] 10958 15097
但请记住,sapply
默认为unlist
结果以方便使用。如果我们指定simplify = FALSE
:
sapply(df[,1],add_day,simplify = FALSE)
[[1]]
[1] "2000-01-02"
[[2]]
[1] "2011-05-03"
因此,当R将列表强制转换为向量时,类信息将被删除,只保留内部存储,即自[具体日期]之后的天数。当然,mapply
也有一个SIMPLIFY
参数,其作用方式相同。
答案 1 :(得分:12)
另一个选项类似于sapply.preserving.attributes
:
sapply.preserving.attributes = function(l, ...) {
r = sapply(l, ...)
attributes(r) = attributes(l)
r
}
> sapply.preserving.attributes(dates, add_day)
[1] "2000-01-02" "2011-05-03"
答案 2 :(得分:0)
运行mapply后可以使用这一行代码
df$date <- as.Date(as.numeric(df$date))