Почему mapply не возвращает объекты даты? - PullRequest
10 голосов
/ 08 октября 2011

У меня есть функция, которая принимает объект Date и возвращает его.Однако, когда я применил функцию к столбцу data.frame с помощью функции mapply, я столкнулся с проблемами: я возвращал объекты Date, как и ожидалось, а не числа.Есть идеи, как я могу преобразовать их в объекты 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 ]

14 голосов
/ 08 октября 2011

Ваша функция - это , возвращающая «даты», но не в том формате, к которому вы привыкли.Даты хранятся внутри, как дни с [некоторые фиксированные даты].(Я не могу вспомнить, какой из них, и немного варьируется в зависимости от конкретного формата.)

Если вы завернете свой вызов 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, который действует аналогичным образом.

12 голосов
/ 08 октября 2011

Другой вариант - что-то вроде 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"
0 голосов
/ 13 мая 2016

Может использовать эту единственную строку кода после запуска mapply

df$date <- as.Date(as.numeric(df$date))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...