我有一组客户,他们的日常活动日志(log),如果他们有和问题提出在他们的帐户.客户可以在其作为客户的整个期间多次在其帐户上提出问题,并且问题可能会持续数天.我想弄清楚每个帐户提出问题的持续时间.日期可以从任何地方开始,问题可以在任何时间发生,在下面的示例中另存为TRUE=1和FALSE=0.

以下是一些示例数据:

df <- data.frame(customer= c('AB','AB','AB','AB','AB',
                             'BC','BC','BC',
                             'CD','CD','CD','CD'), 
                 date=as.Date(c("11/09/2000","12/09/2000","13/09/2000",
                                "14/09/2000","15/09/2000",
                                "13/09/2000","14/09/2000","15/09/2000",
                                "23/05/2001","24/05/2001","25/05/2001",
                                "26/05/2001"), "%d/%m/%Y"), 
                 issue=c(0,1,1,1,1,0,0,1,1,0,1,1))

我试着做了一个索引计数器,以及在这个线程中发现的其他一些变体:Calculate days since last event in R,但它不计算连续的天数(即AB每天都显示持续时间为1,而不是2,3,4),如下所示:

customer date issue duration
AB 2000-09-11 0 0
AB 2000-09-12 1 1
AB 2000-09-13 1 1
AB 2000-09-14 1 1
AB 2000-09-15 1 1

我需要的输出类似于:

customer date issue duration
AB 2000-09-11 0 0
AB 2000-09-12 1 1
AB 2000-09-13 1 2
AB 2000-09-14 1 3
AB 2000-09-15 1 4
BC 2000-09-13 0 0
BC 2000-09-14 0 0
BC 2000-09-15 1 1
CD 2000-05-23 1 1
CD 2000-05-24 0 0
CD 2000-05-25 1 1
CD 2000-05-26 1 2

推荐答案

(下面的所有方法都假设first(issue)issue[1]本身就足够"真实",如n 0FALSE.如果您的实际数据不是那么幸运,则需要更新条件(例如,issue[1] > 0也可以在这里使用).

dplyr

我们将使用consecutive_id()(用于运行长度编码),然后使用group来计算天数.

library(dplyr)
df |>
  mutate(ticket = consecutive_id(customer, issue)) |>
  mutate(duration = if (first(issue)) as.numeric(date - min(date)) + 1 else 0, .by = c(customer, ticket))
#    customer       date issue ticket duration
# 1        AB 2000-09-11     0      1        0
# 2        AB 2000-09-12     1      2        1
# 3        AB 2000-09-13     1      2        2
# 4        AB 2000-09-14     1      2        3
# 5        AB 2000-09-15     1      2        4
# 6        BC 2000-09-13     0      3        0
# 7        BC 2000-09-14     0      3        0
# 8        BC 2000-09-15     1      4        1
# 9        CD 2001-05-23     1      5        1
# 10       CD 2001-05-24     0      6        0
# 11       CD 2001-05-25     1      7        1
# 12       CD 2001-05-26     1      7        2

base R

更冗长一点,同样的逻辑.

df$ticket <- with(df, ave(issue, list(customer), FUN = function(z) {
  r <- rle(z)
  r$values <- seq_along(r$values) * r$values
  inverse.rle(r)
}))
df$duration <- with(df, ave(1:nrow(df), list(customer, ticket), FUN = function(i) {
  if (length(i) && issue[i][1]) {
    as.numeric(date[i] - min(date[i])) + 1
  } else rep(0, length(i))
}))
df
#    customer       date issue ticket duration
# 1        AB 2000-09-11     0      0        0
# 2        AB 2000-09-12     1      2        1
# 3        AB 2000-09-13     1      2        2
# 4        AB 2000-09-14     1      2        3
# 5        AB 2000-09-15     1      2        4
# 6        BC 2000-09-13     0      0        0
# 7        BC 2000-09-14     0      0        0
# 8        BC 2000-09-15     1      2        1
# 9        CD 2001-05-23     1      1        1
# 10       CD 2001-05-24     0      0        0
# 11       CD 2001-05-25     1      3        1
# 12       CD 2001-05-26     1      3        2

data.table

dplyr步非常相似.

library(data.table)
as.data.table(df)[, ticket := rleid(issue),
                  by = "customer"
  ][, duration := if (first(issue)) as.numeric(date - min(date)) + 1 else 0,
    by = c("customer", "ticket")]

R相关问答推荐

使用lapply的重新定位功能

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

R Highcharts与两个位置关联的注释

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

如何使用按钮切换轨迹?

RStudio中相关数据的分组箱形图

如何直接从R中的风险分数计算c指数?

使用R闪光显示所有数据点作为默认设置

如何使用ggplot对堆叠条形图进行嵌套排序?

SHINY:使用JS函数应用的CSS样式显示HTML表格

`夹心::vcovCL`不等于`AER::tobit`标准错误

如何计算R glm probit中的线性预测因子?

我们如何在R中透视数据并在之后添加计算

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

带RStatix的Wilcoxon环内检验

在r中整理图例和堆叠图的问题

如何将EC50值绘制在R中的剂量-react 曲线上?

如何使用包metaviz更改标签的小数位数?

通过不完全重叠的多个柱连接

如何在给定的环境中找到函数的函数参数?