首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当每个组合都不总是出现时,r-累积频率

当每个组合都不总是出现时,r-累积频率
EN

Stack Overflow用户
提问于 2014-11-04 16:24:42
回答 1查看 114关注 0票数 0

我需要让累积客户的电话数量达到每天。

一个示例表是:

代码语言:javascript
运行
复制
> 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+d2-11不会出现在表中。如果我跑:

代码语言:javascript
运行
复制
series<-data.frame(dcast(data, elegidos+dia~cumllam , length))

我得到:

代码语言:javascript
运行
复制
> 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

但是,如果考虑到到第二天客户机被调用一次的次数,客户机a就应该出现,而不是因为我在前一个表中没有针对组合客户机a和第2-11天的行。

该表应如下所示:

代码语言:javascript
运行
复制
  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. 客户"a“在第一天和第三天接到电话,客户"b”在第一天接到两个电话,第二天接到一个电话。所以,第一天我们有一个客户接到一个电话,另一个接收两个电话。
  2. 第二天,由于它是累积的,我们有客户a,谁保持不变的一个电话,客户b谁得到了多一个电话,达到3个电话。
  3. 在第三天,客户a接收另一个电话并累积最多2个呼叫,这就是为什么他在x2中而客户b在x3中保持不变的原因。

是否有一种方法可以对每一天进行累积计数,而不必为每个客户天组合创建一行?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 15:39:58

试试这个:

代码语言:javascript
运行
复制
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中这样做。

代码语言:javascript
运行
复制
 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

数据

代码语言:javascript
运行
复制
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"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26740088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档