【问题标题】:Get index of element in unfiltered vector获取未过滤向量中元素的索引
【发布时间】:2019-01-16 09:34:36
【问题描述】:

我有一个来自向量的 rle 对象,并希望在最大长度(值 == TRUE)之前和之后获取长度总和(值 == TRUE 和值 == FALSE)

我能做到的:

se <- c(3,1,2,3,1,2,3,4,5,6,5,8,9,9,9,5,4,3,4,5,4,3,2)
obj <- rle(se > 4)

obj

Run Length Encoding
  lengths: int [1:5] 8 8 3 1 3
  values : logi [1:5] FALSE TRUE FALSE TRUE FALSE

#Getting the maximum with values == True
with(obj, max(lengths[values]))

8

但是现在我不确定如何继续,.. 如果我尝试通过 match() 找到最大值 8,我会首先找到值 == FALSE 的元素,我不能相信没有其他长度= 8 值 == FALSE 在我试图寻找的最大值的右边。

对于所示示例,预期结果将是:

Sum1 = 8 
Sum2 = 7

非常感谢您的帮助, 亚瑟尔

【问题讨论】:

  • 我不确定我能不能完全跟随你。 Sum1 是否等于第一个 8Sum2 等于来自您的 3 + 1 + 3obj lenghts
  • 没错。我用with(obj, max(lengths[values])) 找到的最大值是obj 的第二个元素。所以左边只有另一个 8 是 Sum1,右边是 3 + 1+ 3 给出 7 作为 Sum2

标签: r vector


【解决方案1】:

这是一个使用data.table 中的rleid 来创建TRUE/FALSE 组的想法,即

i1 <- setNames(se > 4, data.table::rleid(se > 4))
i2 <- names(which.max(tapply(names(i1)[i1], names(i1)[i1], length)))
sum1 <- length(i1[names(i1) < i2])
sum2 <- length(i1[names(i1) > i2])
sum1
#[1] 8
sum2
#[1] 7

你也可以把它变成一个函数,

f1 <- function(x, size) {
    i1 <- setNames(x > size, data.table::rleid(se > size))
    i2 <- names(which.max(tapply(names(i1)[i1], names(i1)[i1], length)))
    return(c(length(i1[names(i1) < i2]), length(i1[names(i1) > i2])))
}

f1(se, 4)
#[1] 8 7

【讨论】:

    【解决方案2】:

    另一种可能的方法:

    with(obj, {
        i <- which(values & lengths==max(lengths))
        c(sum(lengths[seq_len(i-1)]), sum(lengths[-seq_len(i)]))
        })
    

    输出:

    [1] 8 7
    

    【讨论】:

      猜你喜欢
      • 2023-01-02
      • 2021-08-07
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多