2017-01-28 6 views
0

私は 'batsmen'と呼ばれるデータフレームを持っています。それは100k行に近いです。Rにforループを含まない条件付き整数シーケンスの組み合わせを作成するにはどうすればよいですか?

1つの列を「Inns」と呼びます。これは次のようになります:{1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,0,0,1,1,1,1,1 、2,2,2,2,2,2,2 ...}

新しいデータ列を同じデータフレームに定義したいとします。これは条件付き整数シーケンス(seq.int)になります。それは1から始まり、 'Inns'の値が変わるまで続きます。 「Inns」の値が変わるとすぐに、「Position」が再び1から始まります。したがって、上記の「Inns」の例では、「Position」は次のようになります。 {1,2,3,4,1,2,3,1,2,3,4,5,1,2,3、 4,1,2,1,2,3,4,5,1,2,3,4,5,6,7 ....}

私はこれをforループを使って行うことができます。しかし、私はこれをプログラム全体の小さな一歩として見ているので、実行時に失うことは望ましくありません。 forループを使わずに簡単な方法を提案できますか?

答えて

2

あなたが連続して同じ値の各チャンクのIDを作成し、シーケンスを作るために、グループ変数として使用されdata.table::rleidを使用することができます。

x <- c(1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,0,0,1,1,1,1,1,2,2,2,2,2,2,2) 
ave(x, data.table::rleid(x), FUN = seq_along) 
# [1] 1 2 3 4 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1 2 3 4 5 1 2 3 4 5 6 7 

それともに卑diffcumsumを使用することができますグループ変数を作成します。

ave(x, cumsum(c(F, diff(x) != 0)), FUN = seq_along) 
# [1] 1 2 3 4 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1 2 3 4 5 1 2 3 4 5 6 7 
1

我々は、ベースR rle機能を使用し、それはだ抽出することができますプロパティを使用し、sequence関数を使用して適切なシーケンスを生成します。

sequence(rle(x)$lengths) 
#[1] 1 2 3 4 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1 2 3 4 5 1 2 3 4 5 6 7 
関連する問題