считать количество раз, когда фактор появляется во время скользящего окна - PullRequest
0 голосов
/ 26 августа 2018

Я хочу создать столбец: «PriorityCountInLast7Days». Для данного сотрудника А в этом столбце подсчитывается количество СЛУЧАЙ за последние 7 дней, где ПРИОРИТЕТ совпадает с текущим случаем. Как бы я сделал это в R с первыми 4 столбцами?

data <- data.frame(
    Date = c("2018-06-01", "2018-06-03", "2018-06-03", "2018-06-03",  "2018-06-04", "2018-06-01", "2018-06-02", "2018-06-03"),
Emp1 = c("A","A","A","A","A","A","B","B","B"),
Case = c("A1", "A2", "A3", "A4", "A5", "A6", "B1", "B2", "B3"),
Priority = c(0,0,0,1,2,0,0,0,0),
PriorityCountinLast7days = c(0,1,2,1,1,3,1,2,3))

+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете выполнить это скользящее окно с итерационной условной суммой в вашем полном наборе данных.Что это значит?В цикле for вы можете проверить, что ваша текущая дата> = даты, которые вы хотите включить, И даты, которые вы хотите включить> = на дату 7 дней назад, И случаи, которые вы хотите включить, равны == для вашего текущего дела.Эта логическая комбинация в цикле создаст для вас этот скользящий фильтр.Вот функция:

rollPriority <- function(data, window = 7){
  stopifnot(all(c("Date","Case","Priority") %in% colnames(data))) # string error check
  data$Date <- as.Date(data$Date)
  for(i in 1:nrow(data)){
    #priorxdays <= dates we want <= current date
    datecheck <- (data$Date[i] - (window-1)) <= data$Date & data$Date <= data$Date[i]
    casecheck <- data$Case == data$Case[i]
    data$PriorityCountinLastXdays[i] = sum(data$Priority[which(datecheck & casecheck)])
  }
  Xdays <- which(colnames(data) == "PriorityCountinLastXdays")
  colnames(data)[Xdays] <- paste0("PriorityCountinLast", window, "days")
  return(data)
}

В будущем, пожалуйста, предоставьте пример данных с воспроизводимым выводом.Вы заметите, что мы не можем соответствовать ожидаемому 7-дневному скользящему результату, только увидев информацию за 4 дня.Быстрый метод здесь - использовать expand.grid() для генерации комбинаций и set.seed() для сохранения результатов выборки:

# Reproducible Example Data
dat <- expand.grid(Date = seq.Date(as.Date("2018-06-01"),
                                   as.Date("2018-06-4"), 
                                   by = "day"), 
                   Case = as.factor(sort(apply(expand.grid(c("A","B"),1:2), 
                                               1, 
                                               paste0, 
                                               collapse = ""))))
# Ensures random sampling is identical each time
set.seed(42); 
dat$Priority <- sample(0:1, nrow(dat), replace = T)

# The function
rollPriority(dat, 2)
#         Date Case Priority PriorityCountinLast2days
#1  2018-06-01   A1        1                        1
#2  2018-06-02   A1        1                        2
#3  2018-06-03   A1        0                        1
#4  2018-06-04   A1        1                        1
#5  2018-06-01   A2        1                        1
#6  2018-06-02   A2        1                        2
#7  2018-06-03   A2        1                        2
#8  2018-06-04   A2        0                        1
#9  2018-06-01   B1        1                        1
#10 2018-06-02   B1        1                        2
#11 2018-06-03   B1        0                        1
#12 2018-06-04   B1        1                        1
#13 2018-06-01   B2        1                        1
#14 2018-06-02   B2        0                        1
#15 2018-06-03   B2        0                        0
#16 2018-06-04   B2        1                        1

Таким образом, кому-то будет проще точно помочь вам.

...