【问题标题】:For loop problems in r: Error in if (length[i] == 1) { : missing value where TRUE/FALSE needed对于 r 中的循环问题:if (length[i] == 1) { 中的错误:需要 TRUE/FALSE 的缺失值
【发布时间】:2019-09-13 23:21:09
【问题描述】:
ann <- 1:2500
len <- sample(1:3,1000,replace=TRUE)
df <- data.frame(col1= c(1:2500),col2= c(1:2500))

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

尝试使 2 的每个实例在下一行以数字 2 重复。此外,如果有 3,我希望这之后的两行具有数字 3。谢谢!我需要练习 for 循环。

Error in if (length[i] == 1) { : missing value where TRUE/FALSE needed

更新:for 循环将用以下数字替换每个重复的行,我需要知道如何在每个 2 实例之后生成 i+1,在每个 3 实例之后生成 i+2。

【问题讨论】:

  • 通过创建一个像这样调用的变量来重载函数length当你打算使用函数本身时似乎是一个灾难
  • 您不想要吗? ann &lt;- 1:2500 length &lt;- sample(1:3,1000,replace=TRUE) df &lt;- data.frame(col1= c(1:2500),col2= c(1:2500)) for (i in 1:length(ann)) { if (i==1) { df$col1[i] &lt;- length[i] } else if (i==2) { df$col1[i] &lt;- length[i] df$col1[i+1] &lt;- length[i] } else if (i==3) { df$col1[i] &lt;- length[i] df$col1[i+1] &lt;- length[i] df$col1[i+2] &lt;- length[i] } }
  • 我希望 2 的每个实例出现两次,即我想要 2 行,其中包含数字 2。并且对于 3 的每个实例显示 3 次,因此 3 行的数字为 3。问题是 for - 循环将在重复的行中粘贴后续数字。
  • 你可以考虑使用函数tidyr::uncount来做这个。
  • 由于 R 更专注于矢量化而不是 for 循环,因此已经为此目的构建了一个 R 函数:rep(len, times = len)

标签: r loops for-loop if-statement


【解决方案1】:

在这里,我们可以遍历len 的所有元素,并为每个元素执行一个内部循环,将len 的元素输入到df$col1 的那么多行中。

df_row <- 1
for (i in 1:length(len)) {
  for (j in 1:len[i]) {
    df[df_row, 1] = len[i]
    df_row <- df_row + 1
  }
}

【讨论】:

  • 我整天都在努力解决这个问题,谢谢乔恩!这效果很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多