R 查找连续的运行

R 查找连续的运行,r,R,我有药学背景,对编码还不熟悉。我已经开始读《R编程的艺术》一书了,我逐渐了解了它的概念。好吧,我被题为“查找连续一的运行”的主题困住了。在特定的示例中,有一个向量(1,0,0,1,1,1,0,1,1),从中可以找到1的数量。如果我们想找到连续的两个1,代码应该返回值(4,5,8) 我无法理解书中描述的代码 findruns <- function(x,k) { n <- length(x) runs <- NULL for (i in 1:(n-k+1)) {

我有药学背景,对编码还不熟悉。我已经开始读《R编程的艺术》一书了,我逐渐了解了它的概念。好吧,我被题为“查找连续一的运行”的主题困住了。在特定的示例中,有一个向量(1,0,0,1,1,1,0,1,1),从中可以找到1的数量。如果我们想找到连续的两个1,代码应该返回值(4,5,8) 我无法理解书中描述的代码

findruns <- function(x,k) {
   n <- length(x)
   runs <- NULL
   for (i in 1:(n-k+1)) {
       if (all(x[i:(i+k-1)]==1)) runs <- c(runs,i)
    }
   return(runs)
   }

findruns我们可以使用
stri\u locate\u all
获得一个连续元组的索引。我们将
向量
“v1”粘贴到单个字符串中,并使用regex lookaround(
(?=11)
)来匹配模式。
stri\u locate\u all
给出了
11
所有元组的“开始”和“结束”索引。这里我只提取了
start
列(
[,1]


关于OP的函数,它有两个输入变量,'x'和'k',其中'x'表示向量('v1'),'k'表示元组长度,我猜是2。我们将'n'指定为向量的
长度
,创建
NULL
向量'runs'来分配输出索引。然后,我们循环遍历向量序列直到第6个元素(
n-k+1
),对于每个“i”,我们再次取从“i”到
i+k-1
的序列,即,如果“i”是1,索引将是“2”,序列是
1:2
,则得到向量中的元素对应于
v1[1:2]
,检查它是否等于1,如果
所有
元素都是1,那么我们将“runs”与相应的索引('i')连接起来

数据
v1查看
rle
,例如
rle(c(0,0,1,1,1,0,0,1,1,0,0,0,1,1,1,1,1))
。我现在没有这本书,但马特洛夫通常会检查函数并解释不同的部分。这些函数中的许多在本书的后面部分又回来了。我建议你继续读下去,以后再来读。我相信到时候你会知道得够多的!k定义梯段的长度,因此,如果要查找数字1的长度3的重复,请将3指定给k。x是要在其中查找运行的向量。将NULL赋值给以空向量开始的运行,因为您将使用c()函数连接到它,正如您在提供的代码的第5行中所做的那样。在第一次迭代过程中,你会将第一个查找连接到NULL,现在你有了一些内部运行,在下一次“查找”之后,你不想覆盖NULL中已有的内容,你会将它连接到NULL中并不断重复。问题其实不是找到连续查找的最佳方法,这是关于理解代码(那八行)。@Axeman是的,我理解,但答案不仅仅针对OP。它是针对所有访问SO的人。显示一种无循环的方式来获得输出并不会真正伤害任何人。@Axeman我添加了一些关于OP代码如何工作的描述。如果您想编辑,请随时进行编辑。。
library(stringi)
stri_locate_all(paste(v1, collapse=""), regex="(?=11)")[[1]][,1]
#[1] 4 5 8
 v1 <- c(1,0,0,1,1,1,0,1,1)