【问题标题】:R: count the number of previous rows with the same valueR: 统计前面相同值的行数
【发布时间】:2023-03-20 01:33:01
【问题描述】:

我可以访问包含以下内容的数据框:

  • customer_id:50K 客户
  • 日期:200 个日期(从 1 到 200)
  • nb_visit_life_to_date:客户一生至今的访问次数(今天或过去)。

我需要为每一行计算在该日期已知的不活动期,即从上次访问到当前行日期的天数。

最后一次访问的日期可以从 nb_visit_life_to_date 通过计算之前具有相同值的行数来推断。

例如,如果我有 3 行关于同一用户的相同用户迄今为止的访问次数相同,那么我应该为这第 3 行恢复 2 天的不活动期。

真实数据示例:

input <- data.frame(
  user = c(1,1,1,1,1,2,2,2,2,2),
  date = c(1,2,3,4,5,1,2,3,4,5),
  nb_visit_life_to_date = c(1,1,1,2,3,1,2,2,2,2)
)

output <- data.frame(
  input,
  inactivity_period_from_previous_visit = c(0,1,2,0,0,0,0,1,2,3)
)

理想情况下,我想使用dplyr 语法,但我当然愿意接受所有解决方案。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一个简单的rle(运行长度编码)任务:

    sequence(rle(input$nb_visit_life_to_date)$lengths) - 1
    #  [1] 0 1 2 0 0 0 0 1 2 3
    

    【讨论】:

    • 如果第n个客户的最后一次访问日期等于第n+1个客户的第一次访问日期怎么办?我尝试通过在 dplyr 链 group_by(customer) %&gt;% mutate( sequence(rle(.$nb_visit_life_to_date)$lengths) - 1) 中使用 group_by 来显式显示一个组,但我收到了以下错误消息:incompatible size (%d), expecting %d (the group size) or 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多