день периода в R - PullRequest
       7

день периода в R

0 голосов
/ 24 февраля 2020

Я хочу создать новый столбец, как показано ниже.

id  datetime                day     month duration_day         

1  2019-10-01 00:00:00     1       10      1 
1  2019-10-10 00:00:00     10      10     10
1  2019-10-10 00:00:00     10      10     10
1  2019-10-10 00:00:00     10      10     10
1  2019-11-01 00:00:00     1       11     32
1  2019-12-01 00:00:00     1       12     62
1  2020-01-01 00:00:00     1       1      93
2  2019-10-01 00:00:00     1       10     1
2  2019-10-05 00:00:00     5       10     5
...

Если 2019-10-01 является начальной датой, duration_day равен 1.

Я думаю, что требуется комбинация cumsum, groupby, ...

Как я могу это сделать?

1 Ответ

2 голосов
/ 24 февраля 2020

Это можно решить с помощью dplyr::group_by/mutate и difftime. Я создам новый столбец duration_day2 для сравнения с опубликованным ожидаемым результатом.

library(dplyr)

df1 %>%
  group_by(id) %>%
  mutate(duration_day2 = 1 + difftime(datetime, first(datetime), units = "days"))
## A tibble: 9 x 6
## Groups:   id [2]
#     id datetime              day month duration_day duration_day2
#  <int> <dttm>              <int> <int>        <int> <drtn>       
#1     1 2019-10-01 00:00:00     1    10            1  1.00000 days
#2     1 2019-10-10 00:00:00    10    10           10 10.00000 days
#3     1 2019-10-10 00:00:00    10    10           10 10.00000 days
#4     1 2019-10-10 00:00:00    10    10           10 10.00000 days
#5     1 2019-11-01 00:00:00     1    11           32 32.04167 days
#6     1 2019-12-01 00:00:00     1    12           62 62.04167 days
#7     1 2020-01-01 00:00:00     1     1           93 93.04167 days
#8     2 2019-10-01 00:00:00     1    10            1  1.00000 days
#9     2 2019-10-05 00:00:00     5    10            5  5.00000 days

Чтобы иметь целочисленный столбец duration_day2, далее приведите к классу "integer".

df1 %>%
  group_by(id) %>%
  mutate(duration_day2 = 1 + difftime(datetime, first(datetime), units = "days"),
         duration_day2 = as.integer(duration_day2))

данные в формате dput.

df1 <-
structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), 
datetime = structure(c(1569884400, 1570662000, 1570662000, 
1570662000, 1572566400, 1575158400, 1577836800, 1569884400, 
1570230000), class = c("POSIXct", "POSIXt"), tzone = ""), 
day = c(1L, 10L, 10L, 10L, 1L, 1L, 1L, 1L, 5L), month = c(10L, 
10L, 10L, 10L, 11L, 12L, 1L, 10L, 10L), duration_day = c(1L, 
10L, 10L, 10L, 32L, 62L, 93L, 1L, 5L)), row.names = c(NA, -9L), 
class = "data.frame")
...