Hausladen Carina
Hausladen Carina

Reputation: 149

Writing a for loop in r

I don't know how to write for-loops in r. Here is what I want to do:

I have a df called "na" with 50 columns (ana1_1:ana50_1). I want to loop these commands over all columns. Here are the commands for the first two columns (ana1_1 and 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)

After the loop, all tables (ana1_1:ana50_1) should be written in ana.txt Has anyone an idea, how to solve the problem? Thank you very much!

Upvotes: 1

Views: 336

Answers (2)

mts
mts

Reputation: 2190

Here is a solution with a for loop. Loops tend to be slow in r so people prefer other solutions (e.g. the great answer provided by akrun). This answer is for your understanding of the loop syntax:

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

We are looping through i from 1 to 50 (first line). To select a column there's two (there's actually more than two, but that's for another time) ways to access it: na$ana1_1 or na[,1] both select the first column (second line). In the first case you refer by column name, in the second by column index. Here the second case is more convenient. The rest is your desired calculations.

Be aware that cat creates a new file if ana.txt is not existing yet and appends to it if it is already there.

Upvotes: 1

akrun
akrun

Reputation: 887971

One approach would be to loop through the columns with lapply and using the same code as in the OP's post

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

Wrapping with invisible so that it won't print 'NULL' in the R console.

We can wrap with a condition to check if the file already exists so that it won't add the same lines by accidentally running the code again.

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)
   }))
 }

Upvotes: 2

Related Questions