【发布时间】:2019-08-01 14:53:13
【问题描述】:
我有一个像这样的数据框:
yq store value
2014 Q1 1000 89
如何根据第 1 列中的年份季度添加一个额外的列,该列包含该季度的开始日期。所以在这个例子中我想添加:01-01-2014。
【问题讨论】:
我有一个像这样的数据框:
yq store value
2014 Q1 1000 89
如何根据第 1 列中的年份季度添加一个额外的列,该列包含该季度的开始日期。所以在这个例子中我想添加:01-01-2014。
【问题讨论】:
例如,您可以使用lubridate:
library(tidyverse)
df <- tibble(yq = "2014 Q1", store = 1e3, value = 89)
df_new <- df %>%
mutate(start_date = lubridate::yq(yq))
# A tibble: 1 x 4
yq store value start_date
<chr> <dbl> <dbl> <date>
1 2014 Q1 1000 89 2014-01-01
【讨论】:
zoo as.Date(as.yearqtr(df$yq))
zoo::as.yearqtr(df$yq, format = "%Y Q%q") 上运行as.Date 会返回错误
zoo::as.Date(zoo::as.yearqtr(df$yq, format = "%Y Q%q")) 我从错误的命名空间调用 as.Date :)
假设数据如最后的Note,首先将yq转换为yearqtr对象。此类对象在内部表示为 year + frac,其中 Q1、Q2、Q3 和 Q4 的 frac = 0、1/4、2/4 和 3/4。它们呈现如下所示,并且可以很容易地操作,例如yq + 1/4 是下一季度。请参阅?yearqtr 了解更多信息。
鉴于yearqtr 对象,您甚至可能不需要Date 列;但是,如果您这样做,则将其转换为 Date 类。默认转换是给出季度的第一季度。 (使用as.Date 的frac=1 参数获取季度末。)
library(zoo)
transform(transform(DF, yq = as.yearqtr(yq)), Date = as.Date(yq))
给予:
yq store value Date
1 2014 Q1 1000 89 2014-01-01
如果您不需要 yq 作为 yearqtr 对象,则可以稍微缩短:
transform(DF, Date = as.Date(as.yearqtr(yq)))
假定可重复显示的输入为:
DF <- structure(list(yq = structure(1L, .Label = "2014 Q1", class = "factor"),
store = 1000L, value = 89L), class = "data.frame", row.names = c(NA,
-1L))
【讨论】: