我已经为此苦苦挣扎了一段时间。如何以 7 天的间隔对数据进行分组?
本质上,我试图按从星期五开始的“周”进行分组。日期是在周五和下周四之间随机选择的。由于人为错误,每个时期的观察数量可能不完全相同,尽管通常应该有 7 个。可能会丢失一两个时期。
理想的方法似乎是确定每个日期的周期(即从周五开始的一周)编号,然后将其添加到另一列的数据集中。
> str(data)
'data.frame': 55 obs. of 15 variables:
$ id : num 7 8 9 10 11 12 13 16 17 18 ...
$ q_0001 : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 1 1 1 ...
$ q_0002 : Factor w/ 2 levels "Yes","No": 2 1 1 1 2 2 2 2 2 2 ...
$ q_0003 : Factor w/ 2 levels "Yes","No": 2 2 2 1 2 2 2 2 2 2 ...
$ q_0004 : Factor w/ 2 levels "Yes","No": 1 1 1 1 1 1 2 2 2 2 ...
$ Assm_Date : Date, format: "2014-01-04" "2014-01-08" "2014-01-08" ...
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我删除了不相关的变量。
背景:我们正在进行一个卫生服务改善项目。我们在周五到下周四期间进行了 7 次随机观察(包括)。因此,我需要在这 7 天的时间内对问题的答案进行分组(即在问题 1 到 4 中计算“是”)。
数据如何生成:我们正在研究医院病例(每周约 40 至 50 例)的 4 个质量参数。在之前 7 天的案例中,使用 RNG 选择了 7 个案例。从逻辑上讲,我们可以在星期五执行此操作,因此该时间段是 - 上周五到周四(即昨天)。我们通过 LimeSurvey 界面输入数据。对于每个选定的案例,我们输入案例日期 (Assm_Date) 以及 4 个问题(q_0001 至 q_0004)的是/否答案。我需要每周进行一次操作,因为我们将制作每周进度表。
下面建议的方法*lubridate* week()会很棒
data$week_starting_friday <- week(data$Assm_Date)+5
Run Code Online (Sandbox Code Playgroud)
但不幸的是,即使我修改它也不起作用(见下文)。我相信这是因为该方法仍然根据周日-周一或周一-周日来确定属于某一周的日期,并且我想不出一种方法来要求 lubridate 将周视为周五至周四。
由于该项目仍然很小,我可以选择每次在电子表格程序中手动添加周期间编号,我最终可能会求助于它。然而,如果能够在 R 中找到一种可靠地自动化流程的方法,那就太棒了。谢谢大家的所有答案- 他们非常鼓舞人心,并且在我刚刚学习 R 时就如何使用 R 给出了新的想法。
感谢Llopis 的建议,我看了一个乍一看很难理解的例子。当我理解了它之后,它非常简单和优雅。我的问题的解决方案:
data$Assmt_Week <- 1+ as.numeric(data$Assm_Date - as.Date("2014-01-03")) %/% 7
Run Code Online (Sandbox Code Playgroud)
结果,我在数据集中得到了另一个变量,它为每次观察提供了正确的周数。上面的作用是从评估日期中减去期间开始日期,然后我们得到这些日期之间经过的天数。然后我们进行整数除法,知道评估日期和原始开始日期之间已经过去了多少整周。我们还添加 1,以便第一周从 1 开始,而不是 0。效果就像一个魅力。
dvec <- as.Date("2001-04-01")+0:90
dweek <- as.numeric(dvec-dvec[1]) %/% 7
Run Code Online (Sandbox Code Playgroud)
感谢大家的建议和帮助。