Обойти указание диапазона дат в операторе ifelse в R

Я пытаюсь создать новую колонку, обозначающую квартал в моем data.frame используя ifelse выписка по дате колонки класса as.POSIXct,

это короткая версия даты

 a            

            spot.id local.date
q12014local.1  11824267 2013-12-30
q12014local.2  11825708 2013-12-30
q12014local.3  11823669 2013-12-30
q12014local.4  11825407 2013-12-30
q12014local.5  11824268 2013-12-30
q12014local.6  11825709 2013-12-30
q12014local.7  11823670 2013-12-30
q12014local.8  11825408 2013-12-30
q12014local.9  11824266 2013-12-31
q12014local.10 11825707 2013-12-31

Это ifelse заявление, которое я написал:> a$quarter <- ifelse(a$local.date >= 2013-07-01 & a$local.date <= 2013-09-30,"q32013", ifelse(a$local.date >= 2013-10-01 & a$local.date <= 2013-12-31 , "q42013", ifelse(a$local.date >= 2014-01-01 & a$local.date <= 2014-03-31, "q12014", ifelse(a$local.date >= 2014-04-01 & a$local.date <= 2014-06-30, "q22014", ifelse(a$local.date >= 2014-07-01 & a$local.date <= 2014-09-30, "q32014", NA)))))

По какой-то причине все, что я получаю, это значения NA в моем новом столбце! Я могу использовать row.names в моем data.frame с gsub лайк a$quarter <- gsub("[\\.][0-9]+", "", row.names(a)) но это не идеально. Если ifelse Разбирает объекты даты, я попытался использовать функцию из этого поста: Как предотвратить, если ifelse() превращает объекты Date в числовые объекты, но это не сработало. Я все еще получаю значения АН. Как правильно достичь моей цели?

РЕДАКТИРОВАТЬ: не знал о многочисленных функциях, таких как quarters, format.yearqtr доступно в zoo а также lubridate, Но связано с тем же, что если мои кварталы не совпадают с кварталами календарного года - например, мой квартал 1 начинается в октябре, квартал 2 - в январе и т. Д.

3 ответа

Решение

Без использования какого-либо дополнительного пакета:

transform(dat,qu=paste0(quarters(local.date),format(local.date,'%Y')))

Пытаться

library(zoo)
a$quarter <- format.yearqtr(a$local.date, 'q%q%Y')
a
#                spot.id local.date quarter
#q12014local.1  11824267 2013-12-30  q42013
#q12014local.2  11825708 2013-12-30  q42013
#q12014local.3  11823669 2013-12-30  q42013
#q12014local.4  11825407 2013-12-30  q42013
#q12014local.5  11824268 2013-12-30  q42013
#q12014local.6  11825709 2013-12-30  q42013
#q12014local.7  11823670 2013-12-30  q42013
#q12014local.8  11825408 2013-12-30  q42013
#q12014local.9  11824266 2013-12-31  q42013
#q12014local.10 11825707 2013-12-31  q42013

Обновить

На основании новой информации о запуске quarter от OctoberМожет быть, это помогает.

#creating the data
DATE <- seq(as.Date('1926-05-04'), length.out=1200, by='1 day')
month <- as.numeric(format(DATE,'%m'))
year <- as.numeric(format(DATE,'%Y'))
set.seed(25)
Val <- sample(0:120, 1200, replace=TRUE)
df <- data.frame(DATE, month, year, Val, stringsAsFactors=FALSE)
df$qtr <- ifelse(month %in% 10:12, 'q1', ifelse(month %in% 1:3,
                            'q2', ifelse(month %in% 4:6, 'q3', 'q4')))


indx <- df$year-min(df$year) + !df$month %in% 10:12
indx1 <- cumsum(c(TRUE,diff(indx) <0))
df$year2 <- indx1+ (min(df$year)-1)   
df$Quarter <- with(df, paste0(qtr,year2))
head(df)

Update2

Или на основе @G. Гротендик комментарии

 format(as.yearqtr(df$DATE)-0.75, 'q%q%Y')

Как насчет использования lubridate пакет-х quarter() функция:

df <- read.table(text = "
            spot.id local.date
q12014local.1  11824267 2013-12-30
q12014local.2  11825708 2013-12-30
q12014local.3  11823669 2013-12-30
q12014local.4  11825407 2013-12-30
q12014local.5  11824268 2013-12-30
q12014local.6  11825709 2013-12-30
q12014local.7  11823670 2013-12-30
q12014local.8  11825408 2013-12-30
q12014local.9  11824266 2013-12-31
q12014local.10 11825707 2013-12-31", stringsAsFactors = FALSE)
df$local.date <- as.POSIXct(df$local.date)

library('lubridate')
library('dplyr')

df %>%
  mutate(quarter = paste0("q", quarter(local.date), year(local.date)))
#     spot.id local.date quarter
# 1  11824267 2013-12-30  q42013
# 2  11825708 2013-12-30  q42013
# 3  11823669 2013-12-30  q42013
# 4  11825407 2013-12-30  q42013
# 5  11824268 2013-12-30  q42013
# 6  11825709 2013-12-30  q42013
# 7  11823670 2013-12-30  q42013
# 8  11825408 2013-12-30  q42013
# 9  11824266 2013-12-31  q42013
# 10 11825707 2013-12-31  q42013
Другие вопросы по тегам