Я создаю набор данных и хочу добавить количество недель в набор данных, начиная с первой даты и заканчивая последней. Я использую его, чтобы обобщить гораздо больший набор данных, который я хотел бы в конечном итоге обобщить по неделям.
Используя этот образец:
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
Что точно не правильно. Кроме того, мой реальный набор данных не структурирован последовательно, между неделями пропущено много дней, поэтому прямой последовательный подсчет не работает.
Идеальным конечным результатом является дополнительный столбец «неделя», основанный на фактических датах (а не жестко запрограммированный с типом результата seq_along())
Вы можете вычесть все значения Date
с первым Date
и вычислить разницу, используя 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"))
Аналогичное решение Ронака, но с 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))
Спасибо @Paul, это больше подходит для того, что я ищу, лучше в конвейерном рабочем процессе.