【问题标题】:Writing a for loop in r在 r 中编写一个 for 循环
【发布时间】:2015-11-01 11:14:05
【问题描述】:

我不知道如何在 r 中编写 for 循环。这是我想做的:

我有一个名为“na”的 df,有 50 列 (ana1_1:ana50_1)。我想在所有列上循环这些命令。以下是前两列的命令(ana1_1ana2_1):

t<-table(na$ana1_1)
ana1_1<-capture.output(sort(t))    
cat(ana1_1,file="ana.txt",sep="\n",append=TRUE)     
t<-table(na$ana2_1) 
ana2_1<-capture.output(sort(t)) 
cat(ana2_1,file="ana.txt",sep="\n",append=TRUE)

循环之后,所有的表(ana1_1:ana50_1)都应该写在ana.txt 有没有人有想法,怎么解决这个问题?非常感谢!

【问题讨论】:

  • 或许lapply(na, function(x) {x1 &lt;- capture.output(sort(table(x)));cat(x1, file='ana.txt', sep="\n", append=TRUE)})
  • 效果很好。非常感谢您的快速回答!

标签: r loops for-loop statistics


【解决方案1】:

一种方法是循环使用 lapply 的列并使用与 OP 帖子中相同的代码

 invisible(lapply(na, function(x) {
               x1 <- capture.output(sort(table(x)))
               cat(x1, file='ana.txt', sep="\n", append=TRUE)
  })) 

使用invisible 包装,这样它就不会在 R 控制台中打印“NULL”。

我们可以用一个条件来检查文件是否已经存在,这样它就不会因为意外地再次运行代码而添加相同的行。

if(!file.exists('ana.txt')){
   invisible( lapply(na, function(x) {
        x1 <- capture.output(sort(table(x)))
        cat(x1, file='ana.txt', sep="\n", append=TRUE)
   }))
 }

【讨论】:

    【解决方案2】:

    这是一个带有for 循环的解决方案。 r 中的循环往往很慢,因此人们更喜欢其他解决方案(例如 akrun 提供的出色答案)。这个答案是为了让你理解循环语法:

    for(i in 1:50){
      t1<-table(na[,i])
      t2<-capture.output(sort(t1))    
      cat(t2,file="ana.txt",sep="\n",append=TRUE) 
    }
    

    我们从 1 到 50(第一行)循环遍历 i。要选择一列,有两种(实际上不止两个,但这是另一次)访问它的方法:na$ana1_1na[,1] 都选择第一列(第二行)。在第一种情况下,您按列名引用,在第二种情况下,按列索引引用。这里第二种情况更方便。剩下的就是你想要的计算了。

    请注意,如果ana.txt 尚不存在,cat 会创建一个新文件,如果它已经存在则附加到它。

    【讨论】:

    • 从技术上讲,这是一个很好的答案,但请注意,R 中的 for 循环通常比它们的 *apply() 循环慢;见chapter 4 of Burns's R Inferno
    • @BenBolker 感谢您的指出。我知道那一章,我试图在我的回答中用“倾向于”来暗示这一点。鉴于这是一个说教的答案,我会保持原样,但是你是完全正确的,特别是在这种情况下,lapply 只是一个隐藏循环,正如 akrun 也提到的那样。
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2019-06-21
    相关资源
    最近更新 更多