【问题标题】:Identify first occurence of vector where 12 of 15 values are 1识别向量的第一次出现,其中 15 个值中有 12 个为 1
【发布时间】:2020-07-17 18:59:48
【问题描述】:

我有一个像这样的向量:

test = c(NA, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, 1, 1, 1, 1, NA, NA, 1)

在这个向量中,我想确定 15 个值中的 12 个第一次等于 1。

我已经开始使用rle 来计算连续值:

#get counts of sequences
count = rle(test)

然后根据这个得到一个序列:

#make a sequence of the counts
new <- sequence(count$lengths) 

然后,我会将 new 中的任何值设为 0,其中 test 的值等于 NA:

#when the value was na make the count 0
new[is.na(test)] <- 0

最后我会将所有其他值更改为 1:

#make all other counts 1
new[new !=0] <- 1

将返回:

 [1] 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1

这是我卡住的地方,现在我知道 15 个值中的第 12 个是 1 的索引位置是 idx = 6,但我被困在如何使用算法检索它。

【问题讨论】:

  • 您对第一次达到 12 的索引感兴趣吗?你是怎么得出 index = 6 的?
  • 如果您从 idx = 6 开始并移动 15 个位置,您将看到这是第一次 15 个连续值中的 12 个 = 1。感谢 @akrun

标签: r rle


【解决方案1】:

我们可以使用zoo::rollsum 找到接下来 15 个值总和为 12 或更多的第一个点。

which(zoo::rollsum(test, 15, align = "left", fill = 0) >= 12)[1]
#> [1] 6

reprex package (v0.3.0) 于 2020 年 7 月 17 日创建

【讨论】:

    【解决方案2】:

    我们可以用rollapply做逻辑向量的sum,得到第一个和match相匹配的12的索引

    library(zoo)
    match(12, rollapply(test, width = 15, FUN = function(x) sum(x== 1, na.rm = TRUE)))
    #[1] 6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2023-04-09
      • 2013-04-22
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多