【问题标题】:How to transfer the value of the iteration of a loop and use it within the loop in R?如何传递循环迭代的值并在 R 的循环中使用它?
【发布时间】:2018-10-05 11:21:17
【问题描述】:

我目前正在尝试在 RStudio 中运行一个脚本,其中一部分涉及从数据框中的字符串中删除标点符号。到目前为止,这是一个特别耗时的步骤,所以我想尝试插入一些输出消息,以确保它没有崩溃并且仍在运行。

我的想法是尝试在循环中放置另一个循环来删除标点符号,这将输出一个打印的消息,说明该步骤的完成百分比,但前提是百分比值为整数,以免打印一百万消息。

我尝试使用类似下面的方法,但这里最大的问题是我相当确定我错误地使用了“i”变量,所以这永远不会像我写的那样工作。因此,我希望能够修复或替代我在 if 循环中所拥有的内容。

    for(i in 1:nrow(eqtls)){

      eqtls$gene_id_new[i]=rem_punct(eqtls$gene_id[i])

      if((i/nrow(eqtls)*(100))%%1=0){

        completion = (i/nrow(eqtls))*100

        message(sprintf("Percent complete: %s\n", completion))
      }
    }

进一步澄清:这纯粹是学术性的,因为我正在改用另一种删除标点符号的方法。

【问题讨论】:

  • 这不是一个单独的=,这是一个任务。为了比较,请使用 double ==
  • 您可以使用pbapply 包中的txtProgressBarpblapply,这将比%% 噱头更轻松、更高效,但我怀疑您的rem_punct 函数可以被矢量化并制作得非常快,您可能希望将其发布到codereview.stackexchange.com
  • 就像我在底部说的那样,整个rem_punct 函数实际上是我已经退役的一个函数,因为它解析文件的方法总体上太慢了。不过谢谢你的建议!

标签: r loops


【解决方案1】:

在一个输出行中:

数据

eqtls <- data.frame("var1" = rep(paste(LETTERS[1:26],".",LETTERS[26:1],sep = ""),500), 
                    stringsAsFactors = FALSE)

代码

for(i in 1:nrow(eqtls)){
    eqtls$var1[i] <- gsub("\\.","",eqtls$var1[i])
    if((i/nrow(eqtls)*(100))%%1 == 0){
        cat(paste(round((i/nrow(eqtls))*100,0), "%..."))
    }
}

结果

> 1 %...2 %...3 %...4 %...5 %...6 %...8 %...9 %...10 %...11 %...12 %...
13 %...15 %...16 %...17 %...18 %...19 %...20 %...21 %...22 %...23 %...
24 %...25 %...26 %...27 %...30 %...31 %...32 %...33 %...34 %...35 %...
36 %...37 %...38 %...39 %...40 %...41 %...42 %...43 %...44 %...45 %...
46 %...47 %...48 %...49 %...50 %...51 %...52 %...53 %...54 %...59 %...
60 %...61 %...62 %...63 %...64 %...65 %...66 %...67 %...68 %...69 %...
70 %...71 %...72 %...73 %...74 %...75 %...76 %...77 %...78 %...79 %...
80 %...81 %...82 %...83 %...84 %...85 %...86 %...87 %...88 %...89 %...
90 %...91 %...92 %...93 %...94 %...95 %...96 %...97 %...98 %...99 %...
100 %...

【讨论】:

  • 这或多或少正是我想要的,非常感谢!
  • 如果您觉得这篇文章或任何其他帖子回答了问题,真的建议您点击绿色复选标记,以便将该主题标记为“已回答”。 More info on how to choose a good answer.
【解决方案2】:

此链接 - How to get index in a loop in R 应该可以帮助您处理 R 中的循环。

一般来说——如果你想在循环中迭代值就行——

for(i in eqtls){
    print(i)
}

【讨论】:

  • 感谢您的建议!虽然我知道你的代码可以工作,但我不想这样做,因为它会打印数百万行,而我的目标是更优雅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2017-06-10
  • 2019-05-17
  • 1970-01-01
  • 2018-09-08
  • 2021-11-27
相关资源
最近更新 更多