我有以下问题:
给出观察流,找出小于或等于当前最后一次观察的观测数。例如,如果流式观察是
8,1,10,3,9,7,4,5,6,2
然后我们有以下更新
结果会得到这样的值
1,1,3,2,4,3,3,4,5,2
当我使用庞大的数据集时,解决方案应该非常快。
答案 0 :(得分: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
答案 1 :(得分:1)
您可以使用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
答案 2 :(得分:0)
所以我不能单独留下,所以我创造了一个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的代码那么好。也许有人可以收紧我的循环?