2014-01-31 24 views
1

我想在A爲真後,將行2中的myDF $ cut設置爲true,除非這兩行中的b個單元格的值合計超過2.我已經用for循環做了它,但是我發現它運行速度很慢,所以我希望有一種避免循環的方法。使用矢量化操作在DF的多個單元格上創建條件

set.seed(55) 

myDF <- data.frame(a=as.logical (rbinom(136063,1,0.1)), 
        b=rbinom(136063,2,0.2)) 

myDF$cut <- F 
for (i in 3:length (myDF$a)) { 
if (myDF$a[i-1] & myDF$b[i] <2) myDF$cut[i]<- T 
if (myDF$a[i-2]& (myDF$b[i]+myDF$b[i-1]) < 2) myDF$cut[i] <- T 
} 

回答

1

例如,您可以更快地至少1000次做到這一點,那就是:

transform(myDF, 
      cut = ifelse(c(FALSE,head(a,-1)) & b<2 | 
          c(FALSE,FALSE,head(a,-2)) & (b+c(0,head(b,-1)) < 2), 
         TRUE, 
         FALSE 
     ) 
) 
相關問題