在r中写一个for循环

时间:2015-08-09 12:39:56

标签: r loops for-loop statistics

我不知道如何在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中有没有人有想法,如何解决问题?非常感谢你!

2 个答案:

答案 0 :(得分:2)

一种方法是使用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)
   }))
 }

答案 1 :(得分:1)

这是一个带有for循环的解决方案。循环往往比较慢,所以人们更喜欢其他解决方案(例如akrun提供的很好的答案)。这个答案是为了解你的循环语法:

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

我们正在循环i从1到50(第一行)。要选择一个列,有两个(实际上有两个以上,但这是另一个时间)访问它的方式:na$ana1_1na[,1]都选择第一列(第二行)。在第一种情况下,您按列名称引用,在第二列中按列索引。这里第二种情况比较方便。其余的是你想要的计算。

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