2017-02-14 2 views
2

連続した数のカウントがタグから独立しているように40を超える連続した数をグループワイズ(タグ)与えられたデータフレーム内で連続していない連続していないがグループ単位で数えよう

例えば、私たちはタグ列から6つのグループを持っていますので、すべてのグループでtemp変数がしきい値を超えた回数を計算します.Belowは再現可能です。これと一緒に提示しようとしました。

tag<- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 
     3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,5, 5, 
     6, 6, 6, 6, 6, 6, 6, 6, 6, 6) 
temp<- c(43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41, 43, 44, 39,38, 
     37, 43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41, 43, 44, 
     39, 38, 37, 43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41,43, 
     44, 39, 38, 37) 

df=data.frame(tag=tag,temp=temp) 

の予想される出力は、3列目の状態私たちはdata.tableを使用することができます

enter image description here

+0

オタクがあると思います。あなたの3番目のグループはSr. Noから始まるべきです:いいえ:21 – akrun

+0

@akrunはいそのタイプミス、私はこの先生に同意しますあなたは本当に役に立つコードを説明することができますか? –

答えて

2

です。 'data.frame'を 'data.table'(setDT(df))に変換し、論理タグ(temp >= 40)のランレングスIDを 'tag'、 'grp'でグループ化してグループ化変数を作成し、iを論理条件は、我々は行(seq_len(.N))のシーケンスとして「ステータス」を割り当て、base Rから0

library(data.table) 
setDT(df)[, grp := rleid(temp >= 40)][temp >= 40, status := seq_len(.N) , .(tag, grp) 
      ][is.na(status), status := 0][] 
head(df, 20)  
# tag temp grp status 
# 1: 1 43 1  1 
# 2: 1 44 1  2 
# 3: 1 45 1  3 
# 4: 1 41 1  4 
# 5: 1 43 1  5 
# 6: 1 38 2  0 
# 7: 1 40 3  1 
# 8: 1 41 3  2 
# 9: 1 39 4  0 
#10: 1 37 4  0 
#11: 2 37 4  0 
#12: 2 39 4  0 
#13: 2 45 5  1 
#14: 2 42 5  2 
#15: 2 41 5  3 
#16: 2 43 5  4 
#17: 2 44 5  5 
#18: 2 39 6  0 
#19: 2 38 6  0 
#20: 2 37 6  0 

またはrleを使用して「状態」に「NA」要素を変換します。 aveを「タグ」でグループ化し、論理ベクトル(temp >=40)のrleを取得し、valueslengthsで複製し、sequencelengthsと掛けます。 TRUE/FALSEの値は1/0に強制され、数値に1を掛けるとその数値が返されますが、0では0の値が返されます。

df$status <- with(df, ave(temp >= 40, tag, FUN = function(x) { 
      rl <- rle(x) 
      with(rl, sequence(lengths) * rep(values, lengths))})) 
df$status 
#[1] 1 2 3 4 5 0 1 2 0 0 0 0 1 2 3 4 5 0 0 0 1 2 3 4 5 
#[26] 0 1 2 0 0 0 0 1 2 3 4 5 0 0 0 1 2 3 4 5 0 1 2 0 0 0 0 1 2 3 4 5 0 0 0 
関連する問題