【问题标题】:How to find the streaks of a particular value in R?如何在 R 中找到特定值的条纹?
【发布时间】:2022-08-22 05:40:17
【问题描述】:

rle() 函数返回一个包含值和长度的列表。我还没有找到一种方法来对输出进行子集化以隔离特定值的条纹,该值不涉及两次调用rle(),或将输出保存到稍后子集的对象中(添加步骤)。

例如,对于一系列公平抛硬币中的正面(1's):

s <- sample(c(0,1),100,T)
rle(s)
Run Length Encoding
  lengths: int [1:55] 1 2 1 2 1 2 1 2 2 1 ...
  values : num [1:55] 0 1 0 1 0 1 0 1 0 1 ...

# Double-call:

rle(s)[[1]][rle(s)[[2]]==1]
 [1] 2 2 2 2 1 1 1 1 6 1 1 1 2 2 1 1 2 2 2 2 2 3 1 1 4 1 2

# Adding an intermediate step:

> r <- rle(s)
> r$lengths[r$values==1]
 [1] 2 2 2 2 1 1 1 1 6 1 1 1 2 2 1 1 2 2 2 2 2 3 1 1 4 1 2

我看到仅针对1 获取条纹长度的一种非常简单的方法是简单地调整rle() 代码(答案),但可能还有一种更简单的方法。

    标签: r


    【解决方案1】:

    对于一系列结果s 以及当只对结果oc 上的条纹长度感兴趣时:

    sk = function(s,oc){
      n = length(s)
      y <- s[-1L] != s[-n]
      i <- c(which(y), n)
      diff(c(0L, i))[s[i]==oc]
    }
    

    所以要获得1 的长度:

    sk(s,1)
     [1] 2 2 2 2 1 1 1 1 6 1 1 1 2 2 1 1 2 2 2 2 2 3 1 1 4 1 2
    

    同样对于0

    sk(s,0)
     [1] 1 1 1 1 2 2 2 2 4 1 1 2 1 1 1 1 1 1 3 1 1 2 6 2 1 1 4 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2018-11-15
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多