【问题标题】:R dataframe - adding new column with starting date of year quarterR数据框 - 添加新列与年季度的开始日期
【发布时间】:2019-08-01 14:53:13
【问题描述】:

我有一个像这样的数据框:

yq       store   value    
2014 Q1  1000    89

如何根据第 1 列中的年份季度添加一个额外的列,该列包含该季度的开始日期。所以在这个例子中我想添加:01-01-2014。

【问题讨论】:

    标签: r date dataframe


    【解决方案1】:

    例如,您可以使用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))
    • @akrun 我也是这么想的,但是在zoo::as.yearqtr(df$yq, format = "%Y Q%q") 上运行as.Date 会返回错误
    • @Konrad 已经是默认格式了,不需要指定格式
    • @akrun 就像 zoo::as.Date(zoo::as.yearqtr(df$yq, format = "%Y Q%q")) 我从错误的命名空间调用 as.Date :)
    【解决方案2】:

    假设数据如最后的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))
    

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多