计算字符数及其位置,直到达到某个值
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 给我,除了提出它们出现的位置,即位置 13
和 11
。像
> 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”......)
这是一个选项(基于显示的示例)
- 按操作使用分组 -
tapply
- 根据具有
rleid
的逻辑向量 (x == 'a'
) 创建组
- 将
tapply
中的X
与输入向量序列(seq_along(x)
)相乘,再乘以逻辑向量(x == 'r'
),得到对应的位置'r' 而其他的,即 FALSE 将为 0。
- 指定
FUN
中的 lambda 函数对不为 0 的元素进行子集化
- 上面的步骤 4 returns 一些
list
元素 length
0 因为它们只有 0 个值,我们子集
- 使用
Filter
删除那些空的list
元素
- 用
tail
获取last
元素,指定n = 1
- 附加提取元素的
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 创建
我需要从最后一个值开始计算 r
元素在我的向量中出现的次数,直到它到达 a
元素。例如,假设我有一个向量 V = c('a', 0, 'a', 'r', 'r', 0, 'r', 'a', 0, 'a', 'r' , 0, 'r')
。
请注意,在这种情况下,元素 r
出现的次数直到出现 a
的次数为 2 次。所以我需要一个 return 数字 2 给我,除了提出它们出现的位置,即位置 13
和 11
。像
> 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”......)
这是一个选项(基于显示的示例)
- 按操作使用分组 -
tapply
- 根据具有
rleid
的逻辑向量 ( - 将
tapply
中的X
与输入向量序列(seq_along(x)
)相乘,再乘以逻辑向量(x == 'r'
),得到对应的位置'r' 而其他的,即 FALSE 将为 0。 - 指定
FUN
中的 lambda 函数对不为 0 的元素进行子集化
- 上面的步骤 4 returns 一些
list
元素length
0 因为它们只有 0 个值,我们子集 - 使用
Filter
删除那些空的list
元素 - 用
tail
获取last
元素,指定n = 1
- 附加提取元素的
length
和作为函数输出的 return
x == 'a'
) 创建组
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 创建