我正在尝试使用类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值!我可以使用data.frame
中的row.names和gsub
a$quarter <- gsub("[\\.][0-9]+", "", row.names(a))
,但这并不理想。如果ifelse
取消分类日期对象,我尝试使用此帖子中的函数:How to prevent ifelse() from turning Date objects into numeric objects但是没有成功。我仍然得到NA值。实现目标的正确方法是什么?
编辑:不知道quarters
和format.yearqtr
中提供的众多功能,例如zoo
,lubridate
。但与此相关的是,如果我的宿舍与日历年度宿舍不同 - 例如我的第一季度开始于10月,第1季度是1月份等。
答案 0 :(得分:2)
尝试
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)
或基于@G。格洛腾迪克的评论
format(as.yearqtr(df$DATE)-0.75, 'q%q%Y')
答案 1 :(得分:2)
不使用任何额外的包裹:
transform(dat,qu=paste0(quarters(local.date),format(local.date,'%Y')))
答案 2 :(得分:1)
如何使用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