Подсчет на основе нескольких условий с использованием sqldf - PullRequest
1 голос
/ 06 февраля 2020

Привет всем, я пишу sql запрос на R с использованием sqldf и, похоже, попал в контрольно-пропускной пункт. У меня есть таблица со столбцом Id, двумя столбцами дат и группировкой по столбцам.

AlertDate  AppointmentDate  ID  Branch
01/01/20   04/01/20         1   W1
01/01/20   09/01/20         1   W1
08/01/20   09/01/20         1   W2
01/01/20   23/01/20         1   W1

Я пишу запрос:

sqldf('select Branch,count(ID) from df where AlertDate <= AppointmentDate 
and AppointmentDate <AlertDate+7 group by Branch')

Из этого запроса результат I ' м получается

Branch Count
W1      1
W2      1

Что правильно на основании запроса. Чего я хочу достичь, так это если мое второе условие ложно ie AppointmentDate меньше AlertDate + 7. Вместо того, чтобы сбрасывать счет, он должен учитываться в следующей группе в зависимости от даты. Например, если alerttdate - 01/01/20, а дата встречи - 23.01.20, тогда он должен учитываться в W4. ceil ((Appointmentdate-alertstdate) / 7) ТАК В конце я хочу получить результат как

Branch  Count
W1      1
W2      2
W4      1

Второй ряд должен учитываться в W2, а 4-й должен быть в W4, а не отбрасываться. Я пытался добиться этого в sql с использованием sqldf в R. Любое возможное решение с использованием R или Sql будет работать для меня.

Вывод dput (тест)

structure(list(AlertDate = structure(c(18262, 18262, 18269, 18262), class = "Date"), AppointmentDate = structure(c(18265, 18270,18270, 18284), class = 
"Date"), ID = c(1, 1, 1, 1), Branch = c("W1","W1", "W2", "W1")), class = c("spec_tbl_df", "tbl_df", "tbl","data.frame"), row.names = c(NA, -4L), problems = 
structure(list( row = 4L, col = "Branch", expected = "", actual = "embedded null", 
file = "'C:/Users/FRssarin/Desktop/test.txt'"), row.names = c(NA,-1L), class = c("tbl_df", "tbl", "data.frame")), spec = structure(list(  cols = list(AlertDate = 
structure(list(format = "%d/%m/%y"), class = c("collector_date", 
"collector")), AppointmentDate = structure(list(format = "%d/%m/%y"), class = c("collector_date",  "collector")), ID = structure(list(), class = c("collector_double", "collector")), Branch = structure(list(), class = 
c("collector_character",  "collector"))), default = structure(list(), class = c("collector_guess",  "collector")), skip = 1), class = "col_spec"))

enter image description here

1 Ответ

1 голос
/ 06 февраля 2020

Вот один из способов сделать это, используя data.table

df <- structure(list(AlertDate = structure(c(18262, 18262, 18269, 18262), class = "Date"), AppointmentDate = structure(c(18265, 18270,18270, 18284), class = 
                                                                                                                     "Date"), ID = c(1, 1, 1, 1), Branch = c("W1","W1", "W2", "W1")), class = c("spec_tbl_df", "tbl_df", "tbl","data.frame"), row.names = c(NA, -4L), problems = 
              structure(list( row = 4L, col = "Branch", expected = "", actual = "embedded null", 
                              file = "'C:/Users/FRssarin/Desktop/test.txt'"), row.names = c(NA,-1L), class = c("tbl_df", "tbl", "data.frame")), spec = structure(list(  cols = list(AlertDate = 
                                                                                                                                                                                      structure(list(format = "%d/%m/%y"), class = c("collector_date", 

Я конвертирую это в data.table и создаю новый столбец для вашей логики c.

library(data.table)
df <- data.table(df)
df <- df[AlertDate <= AppointmentDate] 
df[, new_branch:= ifelse(as.numeric(AppointmentDate-AlertDate)>=7
            ,paste0("W", as.character(ceiling(as.numeric(AppointmentDate-AlertDate)/7))),Branch)]

Вот итоговая таблица

    AlertDate AppointmentDate ID Branch new_branch
1: 2020-01-01      2020-01-04  1     W1         W1
2: 2020-01-01      2020-01-09  1     W1         W2
3: 2020-01-08      2020-01-09  1     W2         W2
4: 2020-01-01      2020-01-23  1     W1         W4

Это результат гупби ..

df[, .(.N, alert=head(AlertDate,1),  appoint=head(AppointmentDate,1)), by = list(new_branch)]
   new_branch N      alert    appoint
1:         W1 1 2020-01-01 2020-01-04
2:         W2 2 2020-01-01 2020-01-09
3:         W4 1 2020-01-01 2020-01-23
...