为什么mapply不返回日期对象?

时间:2011-10-08 18:17:49

标签: r

我有一个函数,它接受一个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?

3 个答案:

答案 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))