2017-08-02 2 views
2

内のデータブロックに基づいてバイナリーベクターを割り当て:Iは、データフレームを有する他のベクター

dat <- data.frame(diffsecs=(c(189, 245, 13988, 2396, 29601, 263, 297, 292, 230, 257, 192, 
    286, 236, 261, 286, 268, 294, 260, 286, 299, 514, 2287, 234, 
    195, 250, 519, 560, 3314, 12340, 186, 184, 180, 180, 180, 180, 
    180, 180, 180, 180, 180, 3072, 180, 180, 206, 180, 180, 180, 
    360, 180, 180, 180, 180, 5220, 180, 437, 246, 218, 212, 472, 
    2356, 2641, 363, 425, 757, 403, 181, 355, 192, 192, 784, 238, 
    250, 261, 272, 2554, 29524, 4482, 6762, 1252, 269, 303, 294, 
    286, 273, 289, 274, 216, 255, 180, 252, 322, 238, 583, 289, 317, 
    308, 305, 308, 312, 330))) 

、複数の、連続する行は、私はバイナリーベクターを割り当てる180が等しいされたインスタンスのブロックを有しますdiffsecsの値が180の場合は1になり、そうでない場合は0になります。しかし、私は180の3つの連続した値が存在するのであれば180の5つの以上の連続したインスタンスのブロックにバイナリーベクターは、私はループを

を使用してみました0

に等しくなるとき、それは1に等しくします

total<- nrow(dat) 
len<- 1:total 

for(i in len){ 
    temp<- dat[i:(i+5),] 
    xdiff<- ifelse(mean(temp$diffsecs)>178 & mean(temp$diffsecs)<182 ,1,0) 
    temp2<- cbind(dat[i,],xdiff) 
    if(i==1) {dat2 <- temp2} 
    else {dat2<- rbind(dat2,temp2)} 

} 

しかし、それはそれを管理せず、必要以上に短いブロックを割り当てます。

答えて

4

あなたは素晴らしいrle機能を利用することができ、それは逆の相手だ:

RLE$values <- as.integer(RLE$values == 180 & RLE$lengths >= 5) 

かさえ:

RLE <- rle(dat$diffsecs) 
RLE$values <- ifelse(RLE$values == 180 & RLE$lengths >= 5,1,0) 
dat2 <- cbind(dat,binarycol=inverse.rle(RLE)) 

として正しく@Frankが指摘し、あなたは第2ラインを短くすることができます:

RLE$values <- RLE$values == 180 & RLE$lengths >= 5 

FALSE/TRUEのベクトルがOKの場合あなたの代わりに、data.tableで0/1

+1

@Frank:うんそうです... – digEmAll

+1

これは素晴らしいです、ありがとうございました。私が必要とするものを正確に行います。 –

+0

1のバッチの直後に最初のバイナリ値を1としても割り当てることができます。つまり、inverse.rle関数を使用して順次インスタンスを記録した後です。したがって、シーケンスが0,0,1,1,1,1,0,0,0の場合、0,0,1,1,1,1,1,0,0に変更されました。 –

2

、あなたがrleidを使用することができます。

library(data.table) 
setDT(dat) 

dat[, v := 
    (diffsecs==180)*(.N >= 5) 
, by = rleid(diffsecs == 180)][] 
関連する問題