Извлечь элементы даты из 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 для анализа?
Ответы
Ответ 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))