r- накопленная частота, когда каждая комбинация не всегда появляется

Мне нужно получить совокупных клиентов по количеству звонков до ежедневных.

Пример таблицы будет:

> data
   dia cli llam elegidos cumllam
1 1-11   a    1        1       1
2 3-11   a    1        1       2
3 1-11   b    2        1       2
4 2-11   b    1        1       3
5 2-11   c    2        0       2

Как вы можете видеть, клиент a не звонил в день 2-11, поэтому комбинированный клиент a + день 2-11 не отображается в таблице. Если я бегу:

series<-data.frame(dcast(data, elegidos+dia~cumllam , length))

Я получил:

> series
  elegidos  dia X1 X2 X3
1        0 2-11  0  1  0
2        1 1-11  1  1  0
3        1 2-11  0  0  1
4        1 3-11  0  1  0

Но если вы до 2-го дня учитываете, сколько клиентов было вызвано один раз, должен появиться клиент a, а это не так, потому что в предыдущей таблице нет строки для комбинированного клиента a и дня 2-11.

Таблица должна выглядеть так:

  elegidos  dia X1 X2 X3
1        0 2-11  0  1  0
2        1 1-11  1  1  0
3        1 2-11  1  0  1
4        1 3-11  0  1  1

x1 - количество клиентов, которые получили до и включая день подряд ровно 1 звонок.

x2 - количество клиентов, которые получили до и включая день в строке ровно 2 вызова.

И так далее.

Объяснение:

  1. Клиент "а" получает вызов в 1-й и 3-й день, клиент "б" получает 2 вызова в 1-й день и 1 вызов во 2-й день. Итак, в первый день у нас 1 клиент получает 1 звонок, а другой получает 2 звонка.
  2. 2-й день, поскольку он кумулятивный, у нас есть клиент a, который остается неизменным с одним вызовом, и клиент b, который получает еще один вызов, достигающий 3 вызовов.
  3. На третий день клиент a получает еще один вызов и набирает до 2 кумулятивных вызовов, поэтому он в x2, а клиент b остается в x3.

Есть ли способ сделать этот кумулятивный подсчет для каждого дня, не создавая строки для каждой комбинации дня клиента?

Благодарю.

1 ответ

Решение

Попробуй это:

dat1 <-data[!!data$elegidos,]
dat2 <- expand.grid(dia=sort(unique(dat1$dia)), cli=unique(dat1$cli))
dat3 <- merge(data,dat2, all=TRUE)
dat3N <- dat3[with(dat3, order( cli, dia)),]
library(zoo)
dat3N[,c('elegidos', 'cumllam')] <- lapply(dat3N[, 
                      c('elegidos', 'cumllam')], na.locf)

library(reshape2)
dcast(dat3N, elegidos+dia~cumllam, length, value.var='cumllam')
#  elegidos  dia 1 2 3
#1        0 2-11 0 1 0
#2        1 1-11 1 1 0
#3        1 2-11 1 0 1
#4        1 3-11 0 1 1

Обновить

Вы также можете сделать это в data.table

 library(data.table)
 DT <- data.table(data)
 setkey(DT, dia, cli)
 DT1 <- rbind(DT[!!elegidos, CJ(dia=unique(dia), 
      cli=unique(cli))],  DT[elegidos==0, 1:2, with=FALSE])
 nm1 <- c('elegidos', 'cumllam')
 #There is also a  roll option but unfortunately I couldn't get it right here.
 # So, I am using na.locf from zoo. 
 DT2 <- DT[DT1[order(cli, dia)]][,(nm1):= lapply(.SD, na.locf), .SDcols=nm1]
 dcast.data.table(DT2, elegidos+dia~cumllam, length, value.var='cumllam')
 #   elegidos  dia 1 2 3
 #1:        0 2-11 0 1 0
 #2:        1 1-11 1 1 0
 #3:        1 2-11 1 0 1
 #4:        1 3-11 0 1 1

данные

data <- structure(list(dia = c("1-11", "3-11", "1-11", "2-11", "2-11"
), cli = c("a", "a", "b", "b", "c"), llam = c(1L, 1L, 2L, 1L, 
2L), elegidos = c(1L, 1L, 1L, 1L, 0L), cumllam = c(1L, 2L, 2L, 
3L, 2L)), .Names = c("dia", "cli", "llam", "elegidos", "cumllam"
), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))
Другие вопросы по тегам