我不知道如何在r中编写for循环。这就是我想要做的事情:
我有一个名为“na”的df,有50列(ana1_1:ana50_1)
。我想在所有列上循环这些命令。以下是前两列(ana1_1
和ana2_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中有没有人有想法,如何解决问题?非常感谢你!
答案 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_1
或na[,1]
都选择第一列(第二行)。在第一种情况下,您按列名称引用,在第二列中按列索引。这里第二种情况比较方便。其余的是你想要的计算。
请注意,如果cat
尚未存在,ana.txt
会创建一个新文件,如果已存在,则附加到该文件。