添加与具有不常见日期的日期列对齐的周计数序列
Add sequence of week count aligned to a date column with infrequent dates
我正在构建一个数据集,并希望能够从第一个日期开始到最后一个日期向数据集添加周数。我用它来总结一个更大的数据集,我想最终按周总结。
使用此示例:
library(dplyr)
df <- tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"),
Week = nrow/7)
# A tibble: 93 x 2
Date Week
<date> <dbl>
1 1944-06-01 0.143
2 1944-06-02 0.286
3 1944-06-03 0.429
4 1944-06-04 0.571
5 1944-06-05 0.714
6 1944-06-06 0.857
7 1944-06-07 1
8 1944-06-08 1.14
9 1944-06-09 1.29
10 1944-06-10 1.43
# … with 83 more rows
这绝对是不对的。另外,我的真实数据集不是按顺序构建的,周与周之间缺少很多天,因此直接按顺序计数是行不通的。
理想的最终结果是一个额外的 "week" 列,基于实际日期(而不是硬编码为 seq_along() 结果类型)
您可以用第一个 Date
减去所有 Date
值,然后使用 "weeks" 中的 difftime
计算差值,floor
所有值和加 1 从 1 开始计数。
df$week <- floor(as.numeric(difftime(df$Date, df$Date[1], units = "weeks"))) + 1
df
# A tibble: 93 x 2
# Date week
# <date> <dbl>
# 1 1944-06-01 1
# 2 1944-06-02 1
# 3 1944-06-03 1
# 4 1944-06-04 1
# 5 1944-06-05 1
# 6 1944-06-06 1
# 7 1944-06-07 1
# 8 1944-06-08 2
# 9 1944-06-09 2
#10 1944-06-10 2
# … with 83 more rows
要在您的 dplyr
管道中使用它,您可以这样做
library(dplyr)
df %>%
mutate(week = floor(as.numeric(difftime(Date, first(Date), units = "weeks"))) + 1)
数据
df <- tibble::tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"))
与 Ronak 类似的解决方案,但 lubridate
:
library(lubridate)
(df <- tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"),
week = interval(min(Date), Date) %>%
as.duration() %>%
as.numeric("weeks") %>%
floor() + 1))
我正在构建一个数据集,并希望能够从第一个日期开始到最后一个日期向数据集添加周数。我用它来总结一个更大的数据集,我想最终按周总结。
使用此示例:
library(dplyr)
df <- tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"),
Week = nrow/7)
# A tibble: 93 x 2
Date Week
<date> <dbl>
1 1944-06-01 0.143
2 1944-06-02 0.286
3 1944-06-03 0.429
4 1944-06-04 0.571
5 1944-06-05 0.714
6 1944-06-06 0.857
7 1944-06-07 1
8 1944-06-08 1.14
9 1944-06-09 1.29
10 1944-06-10 1.43
# … with 83 more rows
这绝对是不对的。另外,我的真实数据集不是按顺序构建的,周与周之间缺少很多天,因此直接按顺序计数是行不通的。
理想的最终结果是一个额外的 "week" 列,基于实际日期(而不是硬编码为 seq_along() 结果类型)
您可以用第一个 Date
减去所有 Date
值,然后使用 "weeks" 中的 difftime
计算差值,floor
所有值和加 1 从 1 开始计数。
df$week <- floor(as.numeric(difftime(df$Date, df$Date[1], units = "weeks"))) + 1
df
# A tibble: 93 x 2
# Date week
# <date> <dbl>
# 1 1944-06-01 1
# 2 1944-06-02 1
# 3 1944-06-03 1
# 4 1944-06-04 1
# 5 1944-06-05 1
# 6 1944-06-06 1
# 7 1944-06-07 1
# 8 1944-06-08 2
# 9 1944-06-09 2
#10 1944-06-10 2
# … with 83 more rows
要在您的 dplyr
管道中使用它,您可以这样做
library(dplyr)
df %>%
mutate(week = floor(as.numeric(difftime(Date, first(Date), units = "weeks"))) + 1)
数据
df <- tibble::tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"))
与 Ronak 类似的解决方案,但 lubridate
:
library(lubridate)
(df <- tibble(Date = seq(as.Date("1944/06/1"), as.Date("1944/09/1"), "days"),
week = interval(min(Date), Date) %>%
as.duration() %>%
as.numeric("weeks") %>%
floor() + 1))