簡體   English   中英

更新經驗累積函數

[英]Updating empirical cumulative function

我有以下問題:

給定觀察流,找出小於或等於當前最后一次觀察的觀測數。 例如,如果流式觀察是

8,1,10,3,9,7,4,5,6,2

然后我們有以下更新

  1. 觀察 - 8,有1個觀察值小於或等於8
  2. 觀察 - 8,1,有1個觀察值小於或等於1
  3. 觀察--8,1,10,有3次觀察少於或等於10
  4. ...

結果,人們將獲得這樣的價值

1,1,3,2,4,3,3,4,5,2

當我使用龐大的數據集時,解決方案應該非常快。

使用for但反方向,我不測試,但我認為它更快。

xx <- c(8, 1, 10, 3, 9, 7, 4, 5, 6, 2)
res = vector('integer',length=length(xx))
for (i in rev(seq_along(xx))) {
  res[i] <- sum(xx[i]>=xx)
  xx <- xx[-i]
}
res
[1] 1 1 3 2 4 3 3 4 5 2

你可以使用sapply

vec <- c(8, 1, 10, 3, 9, 7, 4, 5, 6, 2)

sapply(seq_along(vec), function(x) sum(vec[seq(x)] <= vec[x]))
# [1] 1 1 3 2 4 3 3 4 5 2

由於性能很重要,您也可以使用vapply 它可能更快(未經測試):

vapply(seq_along(vec), function(x) sum(vec[seq(x)] <= vec[x]), integer(1))
# [1] 1 1 3 2 4 3 3 4 5 2

所以我不能單獨留下,所以我創造了一個kludgemonster

   carl<-function(vec) {
newct<-vector('integer',length=length(vec))
vlen<-length(vec)
for(j in 1:length(vec) ) {
    wins<- (which(vec[j:vlen] >= vec[j])+j-1)
    newct[wins]<-newct[wins]+1
}
}

它似乎工作,但......

Rgames> set.seed(20)
Rgames> vec<-runif(2000)



 Rgames> microbenchmark(carl(vec),agstudy(vec),times=10)
Unit: milliseconds
         expr      min       lq   median       uq      max neval
    carl(vec) 86.75314 87.55323 88.16816 88.80831 89.65117    10
 agstudy(vec) 70.26213 70.83771 71.06158 71.72247 71.93800    1

仍然不如agstudy的代碼那么好。 也許有人可以收緊我的循環?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM