【发布时间】:2014-06-06 22:23:25
【问题描述】:
考虑这个向量:
-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
【问题讨论】:
考虑这个向量:
-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
【问题讨论】:
这是一个可以解决问题的函数:
# 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)
【讨论】:
x<-sign(x),而不是两次在向量上运行符号。
我最喜欢的救援功能:
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
【讨论】:
sign,我正在尝试制作一个自定义的与 rle 一起使用,这很好
length(rle(sign(your_vector))[[1]])-1 这样的东西呢?