R: Количество дней до указанной c даты по ID - PullRequest
1 голос
/ 26 марта 2020

У меня есть фрейм данных с несколькими столбцами, самое главное идентификатор и дата. Я хотел бы создать еще один столбец в R, который будет заполнять каждую строку с указанным днем ​​интервала дат. Что-то вроде этого.

id  date 
1   12/31/2019
1   12/30/2019
2   12/26/2019
2   12/25/2019
2   12/24/2019
3   12/22/2019
3   12/21/2019
3   12/20/2019
3   12/19/2019
4   12/15/2019
4   12/14/2019
4   12/13/2019

сделать так

id  date        date count
1   12/31/2019  2
1   12/30/2019  1
2   12/26/2019  3
2   12/25/2019  2
2   12/24/2019  1
3   12/22/2019  4
3   12/21/2019  3
3   12/20/2019  2
3   12/19/2019  1
4   12/15/2019  3
4   12/14/2019  2
4   12/13/2019  1

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Мы можем использовать data.table методы

library(data.table)
setDT(df)[, date_count := frank(as.IDate(date, format = "%m/%d/%Y"), 
              ties.method = 'dense'), id][]
#    id       date date_count
# 1:  1 12/31/2019          2
# 2:  1 12/30/2019          1
# 3:  2 12/26/2019          3
# 4:  2 12/25/2019          2
# 5:  2 12/24/2019          1
# 6:  3 12/22/2019          4
# 7:  3 12/21/2019          3
# 8:  3 12/20/2019          2
# 9:  3 12/19/2019          1
#10:  4 12/15/2019          3
#11:  4 12/14/2019          2
#12:  4 12/13/2019          1

данные

df <- structure(list(id = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L), date = c("12/31/2019", "12/30/2019", "12/26/2019", "12/25/2019", 
"12/24/2019", "12/22/2019", "12/21/2019", "12/20/2019", "12/19/2019", 
"12/15/2019", "12/14/2019", "12/13/2019")),
  class = "data.frame", row.names = c(NA, 
-12L))
1 голос
/ 26 марта 2020

Одна dplyr возможность может быть:

df %>%
 group_by(id) %>%
 mutate(date_count = dense_rank(as.Date(date, format = "%m/%d/%Y")))

      id date       date_count
   <int> <chr>           <int>
 1     1 12/31/2019          2
 2     1 12/30/2019          1
 3     2 12/26/2019          3
 4     2 12/25/2019          2
 5     2 12/24/2019          1
 6     3 12/22/2019          4
 7     3 12/21/2019          3
 8     3 12/20/2019          2
 9     3 12/19/2019          1
10     4 12/15/2019          3
11     4 12/14/2019          2
12     4 12/13/2019          1
0 голосов
/ 27 марта 2020

Другой вариант data.table:

DT[order(id, as.IDate(date, format="%m/%d/%Y")), dc := rowid(id)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...