【问题标题】:R Count number of sign switches for adjacent vector elementsR计数相邻向量元素的符号开关数
【发布时间】: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

【问题讨论】:

    标签: r vector


    【解决方案1】:

    这是一个可以解决问题的函数:

    # 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)
    

    【讨论】:

    • 比 rle 快得多,而且可以添加一个快速的x&lt;-sign(x),而不是两次在向量上运行符号。
    • @Thell 我已经采纳了你的建议。谢谢。
    【解决方案2】:

    我最喜欢的救援功能:

    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
    

    【讨论】:

    • +1 for sign,我正在尝试制作一个自定义的与 rle 一起使用,这很好
    • 这不是给出一个太大的答案吗?那么像length(rle(sign(your_vector))[[1]])-1 这样的东西呢?
    • @JTT 我认为你是对的——我只是在没有将长度与更改数量进行比较的情况下得出了这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多