如何使用 R 中的 next 函数跳过 for 循环中的迭代

How to skip iterations in a for loop using the next function in R

 len1 <- sample(1:2,100,replace=TRUE)
df <- data.frame(col1= c(1:200),col2= c(1:200))

for (i in 1:length(len1)) {
  if (len1[i]==1) { 
       df$col1[i] <- len1[i] }
  else if (len1[i]==2) { 
       df$col1[i] <- len1[i]
       df$col1[i+1] <- 2 
    next
  } 
}

每当 len1 列表中出现“2”时,我想将其添加到后续行中并跳过下一次迭代 (i+1)。基本上,每当 len1 列表中出现“2”时,我都希望 (i+1)。

期望的最终 table 将比 len1 样本长,它应该等于 sum(len1)。 我希望它看起来像这样:每 2 后面跟着一个额外的 2。

> df
   col1 col2
1   2    1
2   2    2
3   1    3
4   2    4
5   2    5
6   1    6 

有什么建议吗?谢谢!

使用一个 skip 变量,它在设置时总是重置为 FALSE

skip <- FALSE
for (i in 1:length(len1)) {
  if (skip) {
    skip <- FALSE
    next
  }
  if (len1[i]==1) { 
    df$col1[i] <- len1[i]
  } else if (len1[i]==2) { 
    df$col1[i] <- len1[i]
    df$col1[i+1] <- 2 
    skip <- TRUE
  } 
}

换句话说,如果前一个 len1 为 2,则 col1 为 2,否则为 len1

我们可以创建一个滞后向量:c(1, len1[-length(len1)]) 以确定一行是否应将前一个 len12 作为其值。 A 1 添加到开头,因为第一行应采用 len1 的值。

所以如果ifelse:

你就可以得到想要的结果
df$col1 <- ifelse(
    c(1, len1[-length(len1)]) == 2,
    2, # if prev is 2, value is 2
    len1 #value of len1 otherwise
)

正如评论中指出的那样,由于涉及sample函数,每次给出的结果都不一样,因此没有必要在这里显示结果。

好的,我想你想要的是

while (i <= length(len1)) {
  if (len1[i]==1) { 
       df$col1[i] <- len1[i] }
  else if (len1[i]==2) { 
       df$col1[i] <- len1[i]
       df$col1[i+1] <- 2 
       i = i + 1
  } 
  i = i + 1
}

在你的问题中你声明你希望跳过 next 循环,但是使用 next 跳出 current 迭代并进入下一个。使用 while 循环可以更好地控制增量,在这种情况下,我们根据 len1[I] 的值将 12 添加到计数器,这意味着我们可以基本上跳过。

这个问题很难理解。一项重要信息公开:

The desired final table will be longer than the len1 sample, it should be equal to sum(len1)

如果我理解正确,如果输入是 1,OP 希望将 1 复制到输出向量,并且他想将两个后续的 2 复制到输出向量,如果输入向量是 2.

如果我的理解是正确的,那么就是这样

rep(len1, times = len1)

会。

因此,使用适当的可重现示例

n_row <- 10L
set.seed(2L)
len1 <- sample(1:2, n_row , replace = TRUE)
len1
[1] 1 2 2 1 2 2 1 2 1 2
rep(len1, times = len1)

returns

[1] 1 2 2 2 2 1 2 2 2 2 1 2 2 1 2 2

当然,sum(len1) == length(rep(len1, times = len1))就是TRUE

因此,data.frame 可以通过

创建
data.frame(col1 = rep(len1, times = len1), col2 = seq_len(sum(len1)))

修复 for 循环(不推荐)

如果我对 OP 意图的理解是正确的,则可以通过为输出向量引入单独的计数 j 来修复 OP 的 for 循环:

df <- data.frame(col1 = seq_len(sum(len1)), col2 = seq_len(sum(len1)))
j <- 1L
for (i in 1:length(len1)) {
  if (len1[i] == 1L) {
    df$col1[j] <- len1[i]
    j <- j + 1L
  }
  else if (len1[i] == 2L) {
    df$col1[j] <- len1[i]
    df$col1[j + 1L] <- 2L
    j <- j + 2L
  }
}
df
   col1 col2
1     1    1
2     2    2
3     2    3
4     2    4
5     2    5
6     1    6
7     2    7
8     2    8
9     2    9
10    2   10
11    1   11
12    2   12
13    2   13
14    1   14
15    2   15
16    2   16