Sapply Изменить формат моей переменной даты POSIXlt
Я использую POSIXlt
чтобы сохранить даты. Я хочу изменить месячные дни каждой переменной даты следующим образом, но это дает ошибку. (Ниже, d
это список дат.)
> d
[1] "2012-02-01 UTC"
> a = sapply(d, function(x) { x$mday=14;})
Warning messages:
1: In x$mday = 14 : Coercing LHS to a list
2: In x$mday = 14 : Coercing LHS to a list
3: In x$mday = 14 : Coercing LHS to a list
4: In x$mday = 14 : Coercing LHS to a list
5: In x$mday = 14 : Coercing LHS to a list
6: In x$mday = 14 : Coercing LHS to a list
7: In x$mday = 14 : Coercing LHS to a list
8: In x$mday = 14 : Coercing LHS to a list
9: In x$mday = 14 : Coercing LHS to a list
> a
sec min hour mday mon year wday yday isdst
14 14 14 14 14 14 14 14 14
Я понял, что это меняет формат моей переменной.
> class(d)
[1] "POSIXlt" "POSIXt"
> a = sapply(d, function(x) { format(x, format = "%Y-%m-%d")})
> a
sec min hour mday mon year wday yday isdst
"0" "0" "0" "14" "1" "112" "0" "91" "0"
Что я могу сделать, чтобы получить следующий
> d
[1] "2012-02-14 UTC"
Я старался format
, as.POSIXlt
и др. методы. Ничего не сработало.
2 ответа
Давайте посмотрим, что происходит. Чтобы было проще, я исправлю анонимную функцию возврата x
:
d <- as.POSIXlt(c('2012-02-01', '2012-02-02'), tz='UTC')
sapply(d, function(x) { x$mday=14; x})
# sec min hour mday mon year wday yday isdst
# 0 0 0 1 1 112 3 31 0
# 0 0 0 2 1 112 4 32 0
#mday 14 14 14 14 14 14 14 14 14
#Warning messages:
#1: In x$mday = 14 : Coercing LHS to a list
#2: In x$mday = 14 : Coercing LHS to a list
#3: In x$mday = 14 : Coercing LHS to a list
#4: In x$mday = 14 : Coercing LHS to a list
#5: In x$mday = 14 : Coercing LHS to a list
#6: In x$mday = 14 : Coercing LHS to a list
#7: In x$mday = 14 : Coercing LHS to a list
#8: In x$mday = 14 : Coercing LHS to a list
#9: In x$mday = 14 : Coercing LHS to a list
POSIXlt
объект является list
внутренне и lapply
и друзья рассматривают это как список. Это означает, что ваша функция добавляет mday
к каждому элементу этого списка, тем самым превращая их в списки.
Ответ @akrun показывает, как вы должны это сделать.
Пытаться
d <- as.POSIXlt('2012-02-01', tz='UTC')
d$mday <- 14
d
#[1] "2012-02-14 UTC"