【问题标题】:Counting number of rows between rows计算行之间的行数
【发布时间】:2018-06-21 20:36:22
【问题描述】:

我有一个包含四列的数据框:user_id、事件和时间

User_id 一个user_id,事件是“A”或“B”,时间就是时间。我需要计算每个“A”值之前出现的“B”值的数量。因此,如果在第一个“A”之前出现了 3 个“B”值,那么“A”的该实例将获得一个值为 3 的新列。如果“B”的下一个值之前有 25 个“B”实例A" 那么这将得到 25 的值。我认为自己是一个可靠的 R/dplyr 熟练工,但这让我很难过!谢谢。

user_id   event   date_time    desired_column
1         B       2018-01-01   NA
1         B       2018-01-02   NA
1         B       2018-01-03   NA
1         B       2018-01-04   NA
1         B       2018-01-05   NA
1         A       2018-01-06   5
1         B       2018-01-07   NA
1         A       2018-01-08   1
2         B       2018-01-05   NA
2         B       2018-01-06   NA
2         A       2018-01-07   2
2         B       ...          NA
2         A       ...          1

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    x <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
    user_id   event   date_time    desired_column
    1         B       2018-01-01   NA
    1         B       2018-01-02   NA
    1         B       2018-01-03   NA
    1         B       2018-01-04   NA
    1         B       2018-01-05   NA
    1         A       2018-01-06   5
    1         B       2018-01-07   NA
    1         A       2018-01-08   1
    2         B       2018-01-05   NA
    2         B       2018-01-06   NA
    2         A       2018-01-07   2')
    

    也许有点笨拙,但是...

    编辑:指定dplyr::lag,因为stats::lag 不能满足我们的需要。)

    x$a <- NA
    x$a[cumsum(rle(x$event)$lengths)] <- rle(x$event)$lengths
    x$a <- dplyr::lag(x$a)
    x$a[x$event == "B"] <- NA
    
    x
    #    user_id event  date_time desired_column  a
    # 1        1     B 2018-01-01             NA NA
    # 2        1     B 2018-01-02             NA NA
    # 3        1     B 2018-01-03             NA NA
    # 4        1     B 2018-01-04             NA NA
    # 5        1     B 2018-01-05             NA NA
    # 6        1     A 2018-01-06              5  5
    # 7        1     B 2018-01-07             NA NA
    # 8        1     A 2018-01-08              1  1
    # 9        2     B 2018-01-05             NA NA
    # 10       2     B 2018-01-06             NA NA
    # 11       2     A 2018-01-07              2  2
    

    【讨论】:

    • 非常感谢 - 一旦我可以提交我的工作,我会尝试弄清楚你是如何做到的!我的英雄!
    • 这是rle 的诡计,我恰好记得。我从来没有在日常工作中真正使用过它,但碰巧记得它确实像这样计算得很好。 (请注意,它同时计算了 A 和 B,这就是为什么我必须清除 B 的原因。它还将计数应用于同一个字母,ergo lag 需要将其转移到下一个。几乎可以肯定还有其他方法可以把这个骗出来。)
    • 对于尝试此解决方案的任何人,请确保您已将延迟分配给 dplyr 而不是基础。我可以看到自己经常使用 cumsum 和 rle 的这种组合;下一步是将其构建成一个函数。
    【解决方案2】:

    使用@r2Evans 的数据:

    x$y    <- NA
    which_ <- which(x$event=="A")
    x$y[which_] <- diff(c(0,which_))-1
    
    #    user_id event  date_time desired_column  y
    # 1        1     B 2018-01-01             NA NA
    # 2        1     B 2018-01-02             NA NA
    # 3        1     B 2018-01-03             NA NA
    # 4        1     B 2018-01-04             NA NA
    # 5        1     B 2018-01-05             NA NA
    # 6        1     A 2018-01-06              5  5
    # 7        1     B 2018-01-07             NA NA
    # 8        1     A 2018-01-08              1  1
    # 9        2     B 2018-01-05             NA NA
    # 10       2     B 2018-01-06             NA NA
    # 11       2     A 2018-01-07              2  2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多