从真[假]向量
set.seed(1)
x = rnorm(1503501) > 0我正在寻找一种执行(快速)方法,以获得第一组n TRUEs.的第一个真的位置。
我所处理的向量(x)完全包含1503501元素(除了一些短得多的元素)。下面是我目前的解决方案。它使用循环,但是循环在R中是非常慢的,有没有更好的,特别是更快的解决方案?
n = 20
count = 0
solution = -1
for (i in 1:length(x)){
if (x[i]){
count = count + 1
if (count == n){solution = i+1-n; break}
} else {count = 0}
}
print(solution)
1182796我正在考虑使用矢量化函数,做一些类似于y = which(x)或最终y = paste(which(x))的事情,并寻找特定的模式,但我不知道如何做到这一点。
发布于 2015-02-24 00:03:48
看看这份成绩单(只使用一个小得多的随机样本)。我认为很清楚,编写一个函数可以很容易地选择满足联合条件的第一个位置,并在这一点之前的长度上使用累积和:
> x = rnorm(1500) > 0
> rle(x)
Run Length Encoding
lengths: int [1:751] 1 1 1 2 1 3 1 2 2 1 ...
values : logi [1:751] FALSE TRUE FALSE TRUE FALSE TRUE ...
> table( rle(x)$lengths )
1 2 3 4 5 6 7 8 9
368 193 94 46 33 10 2 4 1
> table( rle(x)$lengths , rle(x)$values)
FALSE TRUE
1 175 193
2 100 93
3 47 47
4 23 23
5 21 12
6 5 5
7 2 0
8 3 1
9 0 1
> which( rle(x)$lengths==8 & rle(x)$values==TRUE)
[1] 542
> which( rle(x)$lengths==7 & rle(x)$values==TRUE)
integer(0)
> which( rle(x)$lengths==6 & rle(x)$values==TRUE)
[1] 12 484 510 720 744这是我的候选职能:
tpos <- function(x,pos) { rl <- rle(x); len <- rl$lengths;
sum(len[ 1:(which( len == pos & rl$values==TRUE)[1]-1)],1)}
tpos(x,6)
#[1] 18请注意,我从第一个索引中减去一个,这样就不会将TRUE的第一个限定运行的长度添加到该和中,从而计算出第一个这样的TRUE的位置。我猜第一轮n-真的位置将作为极值分布之一分布(尽管并不总是单调增长)。
> tpos(x,8)
[1] 1045
> tpos(x,8)
[1] 1045
> tpos(x,9)
[1] 1417
> tpos(x,10)
[1] 4806
> tpos(x,11)
[1] 2845
> tpos(x,12)
Error in 1:(which(len == pos & rl$values == TRUE)[1] - 1) :
NA/NaN argument
> set.seed(1)
> x = rnorm(30000) > 0
> tpos(x,12)
[1] 23509https://stackoverflow.com/questions/28685834
复制相似问题