【问题标题】:Count number of character and their position until a value is reached计算字符数及其位置,直到达到一个值
【发布时间】:2021-09-03 14:08:38
【问题描述】:

我需要从最后一个值开始计算r 元素出现在我的向量中的次数,直到它到达a 元素。例如,假设我有一个向量V = c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r' , 0, 'r')。 请注意,在这种情况下,元素 r 出现直到出现 a 的次数为 2 次。因此,我需要 a 将数字 2 返回给我,此外还要显示它们出现的位置,即位置 1311。类似的东西

> some.function(c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r' , 0, 'r'))
[1] 2
[2] 13 
[3] 11

> some.function(c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r'))
[1] 1
[2] 11

> some.function(c('a', 0, 'a', 'r', 'r', 0, 'r'))
[1] 3
[2] 7
[3] 5
[4] 4

> some.function(c('a', 0, 'a', 'r', 'r', 0, 'r', 0))
[1] 3
[2] 7
[3] 5
[4] 4

任何提示我该怎么做?

【问题讨论】:

  • 这个问题将通过更多示例案例和预期输出得到显着改善。有关返回职位的其他详细信息也会有所帮助。如果在第一个 'r' 之后有 3 个 'a' 后跟一个 'a' 怎么办?
  • 是的,我同意。我读为the number of times that the element appears,但它也表示位置。不清楚
  • 好的,我准备一张图来更好地解释我的意思。

标签: r vector counting


【解决方案1】:

这里是一个选项(基于显示的示例)

  1. 按操作使用组 - tapply
  2. 基于逻辑向量 (x == 'a') 和 rleid 创建组
  3. 通过tapply 中的X 与输入向量序列 (seq_along(x)) 乘以逻辑向量 (x == 'r') 以便我们得到对应于 'r' 的位置,而其他位置即 FALSE 将是0.
  4. FUN 中的 lambda 函数指定为非 0 的子集元素
  5. 上面的第 4 步返回一些 list 元素,length 0 因为这些元素只有 0 个值,我们是子集
  6. 使用Filter 删除那些空的list 元素
  7. 使用tail 获取last 元素,并指定n = 1
  8. 附加提取元素的length 并将其作为函数输出返回
f1 <- function(x) {

       out <- tail(Filter(length, tapply(seq_along(x) * (x == 'r'), 
             data.table::rleid(x == 'a'), FUN = function(y) y[y != 0])), 1)[[1]]
      c(length(out), out)
        
}

-测试

lapply(lst1, f1)
[[1]]
[1]  2 11 13

[[2]]
[1]  1 11

[[3]]
[1] 3 4 5 7

注意:仅出于测试目的,向量被创建为list。也可以在单个向量上执行此操作

f1(lst1[[1]])

数据

lst1 <- list(c("a", "0", "a", "r", "r", "0", "r", "a", "0", "a", "r", 
"0", "r"), c("a", "0", "a", "r", "r", "0", "r", "a", "0", "a", 
"r"), c("a", "0", "a", "r", "r", "0", "r"))

【讨论】:

    【解决方案2】:

    我还没有检查所有的情况(虽然我的代码看起来应该可以工作),也没有将代码嵌入到函数中,但是这个逻辑似乎可以解决问题。

    ## setup
    x <- c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r' , 0, 'r')
    ## find all 'r' locations
    xpos <- which(x == "r")
    ## reverse
    rx <- rev(x)
    ## truncate at first occurrence of 'a'
    trx <- rx[seq(min(which(rx=="a")))]
    ## count number of 'r' values
    nr <- sum(trx=="r")
    ## find last (nr) 'r' values in the sequence
    rr <- rev(xpos)[seq(nr)]
    

    这可能会在某些边缘情况下中断(向量中根本没有“r”,没有“r”前面有“a”等,根本没有“a”......)

    【讨论】:

      【解决方案3】:

      另一种方法

      somefunc <- function(x){
        y <- which(max(cumsum(x == 'a')) == cumsum(x == 'a') & x == 'r')
        return(c(length(y), rev(y)))
      }
      
      somefunc(c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r' , 0, 'r'))
      #> [1]  2 13 11
      somefunc(c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r'))
      #> [1]  1 11
      somefunc(c('a', 0, 'a', 'r', 'r', 0, 'r'))
      #> [1] 3 7 5 4
      somefunc(c('a', 0, 'a', 'r', 'r', 0, 'r', 0))
      #> [1] 3 7 5 4
      

      reprex package (v2.0.0) 于 2021-06-19 创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        • 2019-11-08
        • 2021-01-15
        • 2016-01-23
        • 1970-01-01
        • 2016-02-27
        • 2020-12-24
        相关资源
        最近更新 更多