我有以下数据帧:
Data <- data.frame(
date = c("2001-01-01", "2001-02-01", "2001-03-01", "2001-04-01", "2001-05-01", "2001-06-01"),
qtr = c("NA", "NA","NA","NA","NA","NA")
)
Run Code Online (Sandbox Code Playgroud)
我想用Year/Quater填写Data $ qtr - fe 01/01(我需要这种格式!).
我写了一个函数:
fun <- function(x) {
if(x == "2001-01-01" | x == "2001-02-01" | x == "2001-03-01") y <- "01/01"
if(x == "2001-04-01" | x == "2001-05-01" | x == "2001-06-01") y <- "01/02"
return(y)
}
n$qtr <- sapply(n$date, fun)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我总是收到错误消息:
Error in FUN(X[[1L]], ...) : Object 'y' not found
Run Code Online (Sandbox Code Playgroud)
为什么?
ton*_*nov 29
你需要说明Vectorize
你的功能:
fun_v <- Vectorize(fun, "x")
fun_v(Data$date)
#[1] "01/01" "01/01" "01/01" "01/02" "01/02" "01/02"
Run Code Online (Sandbox Code Playgroud)
但是,当涉及或多或少的标准任务(例如日期时间操作)时,总有一个解决方案已经可用:
library(zoo)
yq <- as.yearqtr(Data$date, format = "%Y-%m-%d")
yq
#[1] "2001 Q1" "2001 Q1" "2001 Q1" "2001 Q2" "2001 Q2" "2001 Q2"
Run Code Online (Sandbox Code Playgroud)
要转换为您的特定格式,请使用
format(yq, format = "%y/0%q")
#[1] "01/01" "01/01" "01/01" "01/02" "01/02" "01/02"
Run Code Online (Sandbox Code Playgroud)
Jef*_*ker 12
我一直很喜欢lubridate
处理日期的包。超级滑。该quarter
函数找到季度(当然),然后将其与年份配对。
library(lubridate)
Data <- Data %>%
mutate(qtr = paste0(substring(year(date),3,4),"/0",quarter(date)))
Run Code Online (Sandbox Code Playgroud)
如果你不熟悉的%>%
,从magrittr
第一行基本上说“所谓的使用数据帧Data
”,第二行显示“发生变异(或增加)一个名为列qtr
”
编辑 2021-Q2
如果“YY/QQ”格式不重要,那么快速安全的获取年份和季度的方法是:
library(lubridate)
Data %>%
mutate(qtr = quarter(date, with_year = T))
Run Code Online (Sandbox Code Playgroud)
Rol*_*and 10
使用基本功能:
Data$date <- as.Date(Data$date)
Data$qtr <- paste(format(Data$date, "%y"),
sprintf("%02i", (as.POSIXlt(Data$date)$mon) %/% 3L + 1L),
sep="/")
# date qtr
# 1 2001-01-01 01/01
# 2 2001-02-01 01/01
# 3 2001-03-01 01/01
# 4 2001-04-01 01/02
# 5 2001-05-01 01/02
# 6 2001-06-01 01/02
Run Code Online (Sandbox Code Playgroud)
我在 R 中使用quarters()
和制作了类似的格式sub()
:
Data$qtr <- paste(format(Data$date, "%y/"), 0,
sub( "Q", "", quarters(Data$date) ), sep = "")
Run Code Online (Sandbox Code Playgroud)
另一种选择是:
Data$qtr <- lubridate::quarter(Data$date, with_year = T)
Run Code Online (Sandbox Code Playgroud)