2016-08-04 11 views
1

私は、異なるアカウントと勝敗のデータフレームを持っています。私は人が何回行方不明になったかを数えたいと思う。特定の条件でデータフレームに「カウント」列を追加する

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 

答えて

2

一つのオプションのようになりますと、data.tableからrleidです。 'data.frame'を 'data_able'(setDT(df))に変換し、 'account_number and rleid of 'win_lose'にグループ化し、行のシーケンス(seq_len(.N))に 'win_lose <'を掛けて、すべてのFALSE値が強制的になるようにします。 0へと乗じて0になりそしてTRUEが1に強制変換され、我々は(によるグループのために)aveを使用してだろう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オプションで乗算することにより、シーケンス値を取得し、 with 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 
関連する問題