考虑这个载体:
-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
答案 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