如何使用 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)])
以确定一行是否应将前一个 len1
或 2
作为其值。 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]
的值将 1
或 2
添加到计数器,这意味着我们可以基本上跳过。
这个问题很难理解。一项重要信息公开:
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
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)])
以确定一行是否应将前一个 len1
或 2
作为其值。 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]
的值将 1
或 2
添加到计数器,这意味着我们可以基本上跳过。
这个问题很难理解。一项重要信息公开
The desired final table will be longer than the
len1
sample, it should be equal tosum(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