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

Chr*_*h_J 10 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?
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 14

你的函数返回"日期",只是没有在你使用的格式.日期在内部存储为[某个固定日期]后的天数.(我不记得我的头顶哪一个,并且因具体格式而略有不同.)

如果你mapply打电话给as.Date你,你会看到你期望的输出.

要了解这里发生了什么,请考虑mapply使用sapply引擎盖.例如:

sapply(df[,1],add_day)
[1] 10958 15097
Run Code Online (Sandbox Code Playgroud)

但请记住,sapply默认情况下是unlist方便的结果.如果我们指定simplify = FALSE:

sapply(df[,1],add_day,simplify = FALSE)
[[1]]
[1] "2000-01-02"

[[2]]
[1] "2011-05-03"
Run Code Online (Sandbox Code Playgroud)

因此,当R将列表强制转换为向量时,类信息将被删除,只保留内部存储,即自[具体日期]以来的天数.当然,mapply也有一个SIMPLIFY以同样的方式行事的论点.


Owe*_*wen 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"
Run Code Online (Sandbox Code Playgroud)