Преобразование дат во временные ряды на основе разницы с датой в другом фрейме данных в r - PullRequest
0 голосов
/ 16 апреля 2020

РЕДАКТИРОВАНИЕ: чтобы уточнить, что может быть несколько A04 на id

Мне нужно получить все регистрации за предыдущие 6 месяцев, которые указаны c для каждого случая в отдельности.

Я хотел бы установить искусственную временную шкалу. Таким образом, все дела id имеют свою временную шкалу. Начальной точкой является первая строка с x=A=04, затем подсчитываются дни назад / вперед и выбираются дни. ПРИМЕЧАНИЕ: это огромный набор данных, и может быть несколько x=A04 на id.

Мой набор данных выглядит примерно так:

    id x   date
 1: 12 D95 2015-06-19
 2: 12 A04 2015-08-15
 3: 12 A01 2015-03-16
 4: 12 A04 2015-12-20
 5: 10 K20 2017-02-20
 6: 10 B10 2017-09-01
 7: 10 A04 2017-12-11
 8: 10 A84 2017-10-11

Данные: (Отредактировано согласно предложению jay.sf)

df <- structure(list(id = c(12L, 12L, 12L, 12L, 10L, 10L, 10L, 10L), 
    x = c("D95", "A04", "A01", "A04", "K20", "B10", "A04", "A84"
    ), date = structure(c(16605, 16510, 16455, 17217, 17410, 
    17511, 17450, NA), class = "Date")), row.names = c(NA, -8L
), class = "data.frame")

У меня есть отдельный набор данных df_s с однорядными id и самым ранним date из x=A04. Думаю, это поможет, но теперь я застрял ...

Пример отдельного набора данных df_s:

    id date    
 1: 12 2015-08-15 
 2: 10 2017-12-11

Данные (Добавлено по предложению Джея .sf)

df_s <- structure(list(id = c(12L, 10L), date = structure(c(16789, 17511
), class = "Date")), row.names = c(NA, -2L), class = "data.frame") 

Это был бы мой новый набор данных (количество дней не точно рассчитано):

    id x   date       days.since.first.A04
 1: 12 D95 2015-06-19 -98
 2: 12 A04 2015-08-15 0
 3: 12 A01 2015-03-16 -170
 4: 12 A04 2015-12-20 127
 5: 10 K20 2018-02-20 70
 6: 10 B10 2017-09-01 -101
 7: 10 A04 2017-12-11 0
 8: 10 A84 2017-10-11 -60

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Опция с использованием data.table:

setDT(DT, key=c("id","date"))[, date := as.IDate(date)]
DT[, days.since.first.A04 := unique(DT[x=="A04"], by="id")[.SD, on=.(id), i.date - x.date]]

выход:

   id   x       date days.since.first.A04
1: 10 B10 2017-09-01                 -101
2: 10 A84 2017-10-11                  -61
3: 10 A04 2017-12-11                    0
4: 10 K20 2018-02-20                   71
5: 12 A01 2015-03-16                 -279
6: 12 D95 2015-06-19                 -184
7: 12 F85 2015-08-15                 -127
8: 12 A04 2015-12-20                    0

данные:

library(data.table)
DT <- fread("id x   date
12 D95 2015-06-19
12 F85 2015-08-15
12 A01 2015-03-16
12 A04 2015-12-20
10 K20 2018-02-20
10 B10 2017-09-01
10 A04 2017-12-11
10 A84 2017-10-11")
1 голос
/ 16 апреля 2020

Использование match и простое вычитание.

df <- transform(df, days.since=df$date - df_s$date[match(df$id, df_s$id)])
#   id   x       date days.since
# 1 12 D95 2015-06-19  -184 days
# 2 12 F85 2015-03-16  -279 days
# 3 12 A01 2015-01-20  -334 days
# 4 12 A04 2017-02-20   428 days
# 5 10 K20 2017-09-01  -101 days
# 6 10 B10 2017-12-11     0 days
# 7 10 A04 2017-10-11   -61 days
# 8 10 A84       <NA>    NA days

Редактировать: Если ваша переменная даты еще не в "Date" формате, используйте as.Date.

df <- transform(df, days.since=as.Date(df$date) - as.Date(df_s$date[match(df$id, df_s$id)]))

Данные

df <- structure(list(id = c(12L, 12L, 12L, 12L, 10L, 10L, 10L, 10L), 
    x = c("D95", "F85", "A01", "A04", "K20", "B10", "A04", "A84"
    ), date = structure(c(16605, 16510, 16455, 17217, 17410, 
    17511, 17450, NA), class = "Date")), row.names = c(NA, -8L
), class = "data.frame")

df_s <- structure(list(id = c(12L, 10L), date = structure(c(16789, 17511
), class = "Date")), row.names = c(NA, -2L), class = "data.frame")
...