计算字符数及其位置,直到达到某个值

Count number of character and their position until a value is reached

我需要从最后一个值开始计算 r 元素在我的向量中出现的次数,直到它到达 a 元素。例如,假设我有一个向量 V = c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r' , 0, 'r')。 请注意,在这种情况下,元素 r 出现的次数直到出现 a 的次数为 2 次。所以我需要一个 return 数字 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

关于我该怎么做的任何提示?

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

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

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

  1. 按操作使用分组 - tapply
  2. 根据具有 rleid
  3. 的逻辑向量 (x == 'a') 创建组
  4. tapply中的X与输入向量序列(seq_along(x))相乘,再乘以逻辑向量(x == 'r'),得到对应的位置'r' 而其他的,即 FALSE 将为 0。
  5. 指定 FUN 中的 lambda 函数对不为 0
  6. 的元素进行子集化
  7. 上面的步骤 4 returns 一些 list 元素 length 0 因为它们只有 0 个值,我们子集
  8. 使用Filter删除那些空的list元素
  9. tail获取last元素,指定n = 1
  10. 附加提取元素的 length 和作为函数输出的 return
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"))

另一种方法

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 创建