#r
#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 компонентов (смотрите раздел Details в ?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
Комментарии:
1. Спасибо! Это сработало отлично. Я знал, что должно быть простое решение.
2. Существует проблема с этим решением, проверьте ниже.
3. @user1034797: с этим решением проблем нет. Вы предполагаете, что я изменяю элементы объекта POSIXlt, чего я не делаю.
Ответ №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))
Ответ №4:
Если вы используете data.table
пакет, в нем уже есть функции для извлечения компонентов времени данных из POSIXct.
second(x)
minute(x)
hour(x)
yday(x)
wday(x)
mday(x)
week(x)
isoweek(x)
month(x)
quarter(x)
year(x)
Использование простое (например, dt[, day := day(dd_mmm_yy)]
). Вы можете посмотреть полную документацию здесь.