亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在特定值的連續運行中創建計數器

在特定值的連續運行中創建計數器

慕斯王 2019-08-13 15:15:37
在特定值的連續運行中創建計數器我有小時價值。我想計算自上一次非零以來該值連續多少小時。對于電子表格或循環來說,這是一項簡單的工作,但我希望有一個快速的矢量化單行程來完成任務。x <- c(1, 0, 1, 0, 0, 0, 1, 1, 0, 0)df <- data.frame(x, zcount = NA)df$zcount[1] <- ifelse(df$x[1] == 0, 1, 0)for(i in 2:nrow(df))   df$zcount[i] <- ifelse(df$x[i] == 0, df$zcount[i - 1] + 1, 0)期望的輸出:R> df   x zcount1  1      02  0      13  1      04  0      15  0      26  0      37  1      08  1      09  0      110 0      2
查看完整描述

3 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

這里有一個方法,建立在約書亞的rle方法:(編輯以使用seq_len和lapply按馬立克的建議)


> (!x) * unlist(lapply(rle(x)$lengths, seq_len))

 [1] 0 1 0 1 2 3 0 0 1 2

更新。只是為了踢,這是另一種方法,大約快5倍:


cumul_zeros <- function(x)  {

  x <- !x

  rl <- rle(x)

  len <- rl$lengths

  v <- rl$values

  cumLen <- cumsum(len)

  z <- x

  # replace the 0 at the end of each zero-block in z by the 

  # negative of the length of the preceding 1-block....

  iDrops <- c(0, diff(v)) < 0

  z[ cumLen[ iDrops ] ] <- -len[ c(iDrops[-1],FALSE) ]

  # ... to ensure that the cumsum below does the right thing.

  # We zap the cumsum with x so only the cumsums for the 1-blocks survive:

  x*cumsum(z)

}

試試一個例子:


> cumul_zeros(c(1,1,1,0,0,0,0,0,1,1,1,0,0,1,1))

 [1] 0 0 0 1 2 3 4 5 0 0 0 1 2 0 0

現在比較百萬長度向量的時間:


> x <- sample(0:1, 1000000,T)

> system.time( z <- cumul_zeros(x))

   user  system elapsed 

   0.15    0.00    0.14 

> system.time( z <- (!x) * unlist( lapply( rle(x)$lengths, seq_len)))

   user  system elapsed 

   0.75    0.00    0.75 

故事的道德:單行更好,更容易理解,但并不總是最快!


查看完整回答
反對 回復 2019-08-13
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

William Dunlap關于R-help的帖子是尋找與跑步長度相關的所有事情的地方。他在這篇文章中的f7 是

f7 <- function(x){ tmp<-cumsum(x);tmp-cummax((!x)*tmp)}

在目前的情況下f7(!x)。在性能方面有

> x <- sample(0:1, 1000000, TRUE)> system.time(res7 <- f7(!x))
   user  system elapsed 
  0.076   0.000   0.077 > system.time(res0 <- cumul_zeros(x))
   user  system elapsed 
  0.345   0.003   0.349 > identical(res7, res0)[1] TRUE


查看完整回答
反對 回復 2019-08-13
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

rle 將“計算自上一次非零以來該值連續多少小時”,但不是“所需輸出”的格式。


請注意相應值為零的元素的長度:


rle(x)

# Run Length Encoding

#   lengths: int [1:6] 1 1 1 3 2 2

#   values : num [1:6] 1 0 1 0 1 0


查看完整回答
反對 回復 2019-08-13
  • 3 回答
  • 0 關注
  • 552 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號