【问题标题】:add "counting" column to a data frame with certain conditions在特定条件下将“计数”列添加到数据框中
【发布时间】:2016-12-10 01:20:34
【问题描述】:

我有一个不同帐户的数据框,并且有输赢记录。我想计算一个人连续输了多少次。

df <- data.frame(account_number =c(1,1,1,1,1,1,1,2,2,2,2,2,3,3),
                 win_lose = c(-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1))

> df
       account_number win_lose
1               1       -1
2               1       -1
3               1       -1
4               1        1
5               1       -1
6               1       -1
7               1       -1
8               2       -1
9               2       -1
10              2        1
11              2        1
12              2        1
13              3        1
14              3       -1

每个帐户代表一个人。最终结果应该是这样的

           account_number win_lose   losing_streak
   1               1       -1             1
   2               1       -1             2
   3               1       -1             3
   4               1        1             0
   5               1       -1             1
   6               1       -1             2
   7               1       -1             3
   8               2       -1             1
   9               2       -1             2
   10              2        1             0
   11              2        1             0
   12              2        1             0
   13              3        1             0
   14              3       -1             1

【问题讨论】:

    标签: r loops counting


    【解决方案1】:

    一个选项是rleid 来自data.table。将'data.frame'转换为'data.table'(setDT(df)),按'account_numberandrleidof 'win_lose'分组,我们得到行序列(seq_len(.N))乘以'win_lose TRUE 将被强制为 1,我们通过乘以 1 得到序列值。

    library(data.table)
    setDT(df)[, losing_streak := seq_len(.N) * (win_lose <0) ,
                            by = .(account_number, rleid(win_lose))]
    df
    #    account_number win_lose losing_streak
    # 1:              1       -1             1
    # 2:              1       -1             2
    # 3:              1       -1             3
    # 4:              1        1             0
    # 5:              1       -1             1
    # 6:              1       -1             2
    # 7:              1       -1             3
    # 8:              2       -1             1
    # 9:              2       -1             2
    #10:              2        1             0
    #11:              2        1             0
    #12:              2        1             0
    #13:              3        1             0
    #14:              3       -1             1
    

    base R 选项将使用ave(分组依据)和rle

    with(df, ave(win_lose, account_number, FUN = 
      function(x) with(rle(x== -1), sequence(lengths) * rep(values, lengths))))
    #[1] 1 2 3 0 1 2 3 1 2 0 0 0 0 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2017-06-04
      • 2018-08-21
      • 2020-12-09
      相关资源
      最近更新 更多