Подтвердить что ты не робот

Извлечь элементы даты из POSIXlt и поместить в кадр данных в R

Мой второй вопрос дня и моя последняя попытка использовать R для очистки этих данных. Здесь sitrep:

У меня есть кадр данных, который имеет столбец, который является типом даты POSIXlt. Я хочу извлечь из этой колонки день, месяц и год и создать 3 новых столбца, называемых (умно) день, месяц и год.

Кадр данных выглядит следующим образом:

order_id      dd_mmm_yy
   1          2005-07-28
   2          2007-03-04

Я хочу закончить с этим:

order_id      dd_mmm_yy    day   month   year
   1          2005-07-28    28     7     2005
   2          2007-03-04    4      3     2007

Я создал функцию для извлечения дня, месяца и года и возврата их в список (или фрейм данных, я попробовал оба).

extractdate = function (date) {
        day = format(date, format="%d")
        month = format(date, format="%m")
        year = format(date, format="%Y")

       list(day=day, month=month, year=year)
 }

Вот что я пробовал на основе более ранней проблемы и вопроса:

cbind(orders, t(sapply(orders$dd_mmm_yy, extractdate)))

который дает мне это:

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 5, 9

t (sapply... сам по себе дает мне это по какой-то сумасшедшей причине:

      day         month       year       
sec   Character,5 Character,5 Character,5
min   Character,5 Character,5 Character,5
hour  Character,5 Character,5 Character,5
mday  Character,5 Character,5 Character,5
mon   Character,5 Character,5 Character,5
year  Character,5 Character,5 Character,5
wday  Character,5 Character,5 Character,5
yday  Character,5 Character,5 Character,5
isdst Character,5 Character,5 Character,5

Что происходит? Мне лучше использовать что-то вроде Python или Java для выполнения всех манипуляций с данными, которые мне нужно сделать для этих данных, прежде чем вводить их в R для анализа?

4b9b3361

Ответ 1

POSIXlt объекты представляют собой список из 9 компонентов (дополнительную информацию см. в разделе "Подробности" ?POSIXlt). Поскольку столбец dd_mmm_yy POSIXlt, вам не нужна функция для извлечения компонентов. Вы можете просто извлечь компоненты по их именам:

orders$day <- orders$dd_mmm_yy$mday        # day of month
orders$month <- orders$dd_mmm_yy$mon+1     # month of year (zero-indexed)
orders$year <- orders$dd_mmm_yy$year+1900  # years since 1900
orders
#   order_id  dd_mmm_yy day month year
# 1        1 2005-07-28  28     7 2005
# 2        2 2007-03-04   4     3 2007

Ответ 2

Один вкладыш с использованием lubridate

require(plyr); require(lubridate)
mutate(mydf, date = ymd(dd_mmm_yy), day = day(date), 
  month = month(date), year = year(date))

  order_id  dd_mmm_yy       date day month year
1        1 2005-07-28 2005-07-28  28     7 2005
2        2 2007-03-04 2007-03-04   4     3 2007

Ответ 3

Попробуйте это (DF как ваш data.frame):

extractdate <- function(date) {
    day <- format(date, format="%d")
    month <- format(date, format="%m")
    year <- format(date, format="%Y")

    cbind(day, month, year)
}

cbind(DF, extractdate(DF$dd_mmm_yy))