R计算相邻矢量元素的符号开关数

时间:2014-04-22 13:43:51

标签: r vector

考虑这个载体:

-3
4
5
-2
4
-5
6
-1
-1
-1
-8
7

R中有什么简单的方法(例如没有丑陋的循环)来计算有多少"符号开关"是否存在相邻元素?

在这个例子中,我们将有7个开关:

-3 to 4
5 to -2 
-2 to 4
4 to -5
-5 to 6
6 to -1
-8 to 7

2 个答案:

答案 0 :(得分:4)

这是一个可以解决问题的功能:

# Given a numeric array x, this returns the number of sign changes
nSignChanges <- function(x) {
    signs <- sign(x)
    sum(signs[-1] != signs[-length(x)])
}

a <- c(-3, 4, 5, -2, 4, -5, 6, -1, -1, -1, -8, 7)
nSignChanges(a)

答案 1 :(得分:1)

我最喜欢的救援功能:

rle(sign(your_vector))

示例,我假设您没有零:

foo<- sample(-5:5,30,rep=TRUE)

foo<-foo[foo!=0]
rle(sign(foo))
Run Length Encoding
  lengths: int [1:13] 3 1 2 1 8 5 1 1 1 1 ...
  values : num [1:13] -1 1 -1 1 -1 1 -1 1 -1 1 ...
编辑:我向Trimble承认质量:

对于矢量1e6长,microbenchmark返回

Unit: milliseconds
               expr       min        lq    median        uq
 nSignChanges(sfoo)  62.64967  68.94004  70.77263  73.27103
 rSignChanges(sfoo) 128.79518 131.19843 137.15204 137.82534
       max neval
  78.51457    10
 141.93182    10