2016-07-04 2 views
1

У меня проблема с преобразованием дат. Если я использую ymd в приложении, он возвращает числовое значение, или если я использую только ymd, он работает. У кого-то есть идеи?Применить и lubridate

library(lubridate) 
a <- data.frame(dates1=c("2011-01-01",'2011-02-01','2011-03-01'), 
      dates2=c("2013-01-01",'2013-02-01','2013-03-01')) 
apply(a, 2, FUN = function(x) ymd(x)) 

    dates1  dates2 
[1,] 1293840000 1356998400 
[2,] 1296518400 1359676800 
[3,] 1298937600 1362096000 

ymd(a$dates1) 

[1] "2011-01-01 UTC" "2011-02-01 UTC" "2011-03-01 UTC" 

ymd(a$dates2) 

[1] "2013-01-01 UTC" "2013-02-01 UTC" "2013-03-01 UTC" 
+5

Используйте 'lapply()', как 'применить()' падает класс Date в числовой. Вы должны использовать только 'apply()' с матрицами. –

ответ

2

Использование lapply():

lapply(a, function(x) ymd(x)) 

Update/Explaination

Документация apply() гласит:

Во всех случаях результат принуждены as.vector к одному основных векторных типов bef руды размеры устанавливаются, так что (например) результаты коэффициента будут принудительно применены к массиву символов.

Как отмечает J.Ulrich в комментариях к this answer «даты не являются строго векторами». lapply() очень похож на apply(), однако он вернет список, а не вектор. Отсюда его способность обрабатывать даты.

3

apply пытается упростить его, используя as.matrix если вход X двумерно см этот пример:

as.matrix(ymd("2013-01-01")) 
     [,1] 
[1,] 15706 

?apply

Подробности
Если X не является массив, но объект класса с непустым значением dim (например, фрейм данных), приложение ly пытается принудить его к массиву через as.matrix, если он двумерный (например, кадр данных) или через as.array.

2

Вот вариант с использованием mutate_each

library(dplyr) 
a %>% 
    mutate_each(funs(ymd)) 
#  dates1  dates2 
#1 2011-01-01 2013-01-01 
#2 2011-02-01 2013-02-01 
#3 2011-03-01 2013-03-01 
Смежные вопросы