2017-08-02 98 views
2

我有一個數據幀中指定基於數據塊的二進制向量:另一矢量

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多個,連續行實例的嵌段I要分配二元載體當diffsecs的值等於180時等於1,否則等於0。然而,我只希望它在180 5個或更多連續實例的塊時等於1因此,如果有180個連續3個值的二元載體將等於0。

我嘗試使用循環

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

由於正確地指出的@Frank,可以縮短第二行:

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

甚至:

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

如果向量爲FALSE/TRUE對於你不是0/1

+1

@Frank:是啊,沒錯... – digEmAll

+1

這是偉大的,謝謝。正是我所需要的。 –

+0

是否可以有一個擴展名,以便在一批1之後立即指定第一個二進制值爲1?即在使用inverse.rle函數記錄順序實例之後。所以如果你有一個序列:0,0,1,1,1,1,1,0,0,0,你將它改爲0,0,1,1,1,1,1,1,0,0。 –

2

隨着data.table,您可以使用rleid

library(data.table) 
setDT(dat) 

dat[, v := 
    (diffsecs==180)*(.N >= 5) 
, by = rleid(diffsecs == 180)][] 
相關問題