假设我有一个向量,说:
x <- c(1, 0, 1, 0, 0, 0, 1, 1, 0, 0,1,1,1,1,0,1,1,0,1,0,0,0,0,0,1,0,1,0,1,0)
Run Code Online (Sandbox Code Playgroud)
我想获得一个向两个零之间的值求和的向量,即输出应如下所示:
y = c(1,2,4,1,1,1)
Run Code Online (Sandbox Code Playgroud)
请注意,所有的应该在开头为零,在结尾为零,否则将不计算.所以字符串01010只产生1.
我试图使用索引为零的运行长度.
提前致谢
sum.between.zeroes <- function(x) {
library(stringr)
x.str <- paste(x, collapse = "")
nchar(str_extract_all(x.str, "01+0")[[1]]) - 2L
}
sum.between.zeroes(c(1,0,1,0,0,0,1,1,0,0,1,1,1,1,0,1,1,0,1,0,0,0,0,0,1,0,1,0,1,0))
# [1] 1 2 4 1 1 1
sum.between.zeroes(c(0,1,0,1,0))
# [1] 1
sum.between.zeroes(c(1,1))
# integer(0)
Run Code Online (Sandbox Code Playgroud)
如果要保留在基本包中,可以使用gregexpr和regmatches:
sum.between.zeroes <- function(x) {
x.str <- paste(x, collapse = "")
nchar(regmatches(x.str, gregexpr("01+0", x.str))[[1]]) - 2L
}
Run Code Online (Sandbox Code Playgroud)