【问题标题】:How to pivot a table using a sequence of quarters between two dates如何使用两个日期之间的季度序列来旋转表格
【发布时间】:2018-10-02 09:17:18
【问题描述】:

我有一个包含两个日期列(从和到)的数据框。我想在两个日期之间创建一个年份和季度序列,然后重新整形以转换为一个高数据框。

df <- structure(list(id = 1:4, from = structure(c(1L, 1L, 2L, 2L), .Label = c("2018-01-01", "2018-04-01"), class = "factor"), to = structure(c(2L, 1L, 4L, 3L), .Label = c("2018-02-01", "2018-04-01", "2018-07-01", "2018-10-01"), class = "factor")), class = "data.frame", row.names = c(NA, -4L))

> df
id      from        to
1       2018-01-01  2018-04-01
2       2018-01-01  2018-02-01
3       2018-04-01  2018-10-01
4       2018-04-01  2018-07-01

在上面的示例中,id 1 在 Q1 和 Q2 中,而 id 2 仅在 Q1 中。

期望的输出:

#id Quarter
#1  Q1 2018
#1  Q2 2018
#2  Q1 2018
#3  Q2 2018
#3  Q3 2018
#3  Q4 2018
#4  Q2 2018
#4  Q3 2018

我可以使用 seq 函数获得四分之一序列:

dsq <- seq(ymd('2018-01-01'),ymd('2018-04-01'), by = 'quarters')
paste0("Q", lapply(dsq, quarter), " ", lapply(dsq, year))

但我正在寻找一种方法来使用获得的序列来重塑我的表格。

感谢任何帮助。

【问题讨论】:

  • 如果任何答案解决了您的问题,请考虑accept one。

标签: r reshape tidyverse lubridate


【解决方案1】:

我们可以的

library(zoo)
library(tidyverse)
df %>% 
  mutate_at(2:3, zoo::as.yearqtr, format = "%Y-%m-%d") %>% 
  gather(key, Quarter, -id) %>% 
  select(-key) %>% 
  arrange(id)
#  id Quarter
#1  1 2018 Q1
#2  1 2018 Q2
#3  2 2018 Q1
#4  2 2018 Q1
#5  3 2018 Q2
#6  3 2018 Q4
#7  4 2018 Q2
#8  4 2018 Q3

或者试试data.table

library(data.table)
setDT(df)[, `:=`(from = as.Date(from),
                 to = as.Date(to))
          ][, .(Quarter = as.yearqtr(seq(from, to, "quarter"))), by = id]

如果fromto 已经属于date 类,那么这将简化为

setDT(df)[, .(Quarter = as.yearqtr(seq(from, to, "quarter"))), by = id]

【讨论】:

    【解决方案2】:

    你可以在你的代码中添加一些额外的东西:

    f <- function(x,y) {
      dsq <- seq(ymd(x),ymd(y), by = 'quarters')
      paste0("Q", lapply(dsq, quarter), " ", lapply(dsq, year))
    }
    
    df %>% rowwise %>% mutate(quarter=list(f(from,to))) %>% unnest
    ## A tibble: 8 x 4
    #     id from       to         quarter      
    #  <int> <fct>      <fct>      <chr>  
    #1     1 2018-01-01 2018-04-01 Q1 2018
    #2     1 2018-01-01 2018-04-01 Q2 2018
    #3     2 2018-01-01 2018-02-01 Q1 2018
    #4     3 2018-04-01 2018-10-01 Q2 2018
    #5     3 2018-04-01 2018-10-01 Q3 2018
    #6     3 2018-04-01 2018-10-01 Q4 2018
    #7     4 2018-04-01 2018-07-01 Q2 2018
    #8     4 2018-04-01 2018-07-01 Q3 2018
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多