将 52 周的数据拆分为 12 个月

Posted

技术标签:

【中文标题】将 52 周的数据拆分为 12 个月【英文标题】:Split 52 weeks of data into 12 months 【发布时间】:2021-08-12 14:05:14 【问题描述】:

我有一个为多个参与者(G1、G2 等)完成的锻炼课程data.frame 有不同类型的锻炼课程(Sup、Home 等),每种类型每周 2 次。 我有一个“周”变量,但我需要按月提供汇总数据,即获取 52 周的数据并将其分成 12 个月。 这是示例数据:

qdf = data.frame(id = rep(c("G1", "G2", "G3"), 16),
                 type = c(rep("Sup",24), rep("Home", 24)),
                 week = rep(c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4),2),
                 session = c(rep("S1",3), rep("S2", 3), rep("S3",3), rep("S4",3),
                             rep("S5",3), rep("S6", 3), rep("S7",3), rep("S8",3),
                             rep("H1",3), rep("H2", 3), rep("H3",3), rep("H4",3),
                             rep("H5",3), rep("H6", 3), rep("H7",3), rep("H8",3)))

我目前关于如何执行此操作的想法是,在按 id 分组后,为每个会话分配一个虚拟日期,从 01-01-2020 开始,用于会话 S1 和 H1,然后根据日期。或者,添加额外的虚拟行,使每个 week 有 7 天,然后分配日期并拆分。

我真的不确定如何从这些可能的解决方案开始,或者是否没有更好的方法。

【问题讨论】:

映射 (ISO) 周到月取决于年份,并不通用。您还有其他日期信息吗? @MauritsEvers 每个参与者在一段时间内的不同时间开始,完成 52 周。确切的日期并不重要。我会将前大约 4.3 周/ 30 天分配给“第 1 个月”等。作为替代方案,我可以执行类似 `qdf%>% mutate (month = case_when(week >= 48 ~ 12, week >= 43 ~ 11``` 等,将 4 或 5 周分组为一个月。如果我认为每周可以按会话进一步拆分(即 S1 到 S8 = 第 1 个月),那么精度会更高一些,但这需要许多代码行作为多种会话类型 【参考方案1】:

如果您设置了一个起点,例如 2020-01-01,您可以执行以下操作:

qdf <- data.frame(id = rep(c("G1", "G2", "G3"), 16),
                 type = c(rep("Sup",24), rep("Home", 24)),
                 week = rep(c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4),2),
                 session = c(rep("S1",3), rep("S2", 3), rep("S3",3), rep("S4",3),
                             rep("S5",3), rep("S6", 3), rep("S7",3), rep("S8",3),
                             rep("H1",3), rep("H2", 3), rep("H3",3), rep("H4",3),
                             rep("H5",3), rep("H6", 3), rep("H7",3), rep("H8",3)))

library(lubridate)
qdf <- qdf %>% mutate(
  date = ymd("2020-01-01") + weeks(week),
  month = month(date)
)
> head(qdf)
  id type week session month       date
1 G1  Sup    1      S1     1 2020-01-08
2 G2  Sup    1      S1     1 2020-01-08
3 G3  Sup    1      S1     1 2020-01-08
4 G1  Sup    1      S2     1 2020-01-08
5 G2  Sup    1      S2     1 2020-01-08
6 G3  Sup    1      S2     1 2020-01-08

我没有故意删除日期列,因此您可以检查发生了什么。

【讨论】:

以上是关于将 52 周的数据拆分为 12 个月的主要内容,如果未能解决你的问题,请参考以下文章

数据量大,列比较多,请问数据库表该如何设计?

将数据框中的 1 列拆分为 2 列 [重复]

Oracle数据库大数据量表如何优化?

将数据框中的结构类型列拆分为多列

如何使用 Postgresql 将文本拆分为多个字段?

将数据框列拆分为 R 中的向量