将 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 个月的主要内容,如果未能解决你的问题,请参考以下文章