This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Rowname And Column Output From A Data Frame

I have the following dataframe:

   M1 M6 M7  M8  M9 M10 M11
35 48 48 48  96  96  84  84 
37 48 48 48  96  96  84  84    
49 63 63 24  87  87  81  81

and I want 2 outputs from the data frame as follows:

output1: row names and the first elements of the first column (M1): e.g., row 35: 48

output2: row names and the result of dividing the elements of row 7 (M11) by the elemnts of row 1 (M1):

e.g., row 35: 0.57

My code:

data <- data.frame(data)

data$id <- rownames(data)

for (i in 1:nrow(data)){
id <- data$id[i]
u <- data[i,1]
x <- data$M11[i]/dataM1[i]
#table(id,u)
#print(table(id,u))
#table(id,x)
cat(sprintf('row %s: %s', id, u))
cat(sprintf('row %s: %s', id, x))
#print(id, u)
}

Using the commentd out "print(table(id,u))" gives the right output but not well formated , but "cat(sprintf('row %s: %s', id, u))" gives R's row index and value for u. Any help to get the code working properly will be appreciated! Thanks

r microarray

1 answer

This would seem to be an easier way to do things. I saved your example file as "blah.txt" and made it tab separated.

d <- read.table("blah.txt", header=T, row.names=1)
#This would just give output1
#cat(sprintf("row %s: %i", row.names(d), d$M1), sep="\n")
#This would give output2
#cat(sprintf("row %s: %4.2f", row.names(d), d$M11/d$M1), sep="\n")
#This will give both, with the rows properly interleaved
cat(sprintf("row %s: %i\nrow %s: %4.2f", row.names(d), d$M1, row.names(d), d$M11/d$M1), sep="\n")

You can modify the sprintf() bit to do pretty much whatever you want. Try to avoid for loops in R, they're super slow.

Thanks dpryan. It worked nicely! I was amazed at how I did not need the for loop. Is this due to cat()?

No, just remember that R isn't like C or other languages, where you would need the for loop. 9 times out of 10, you'll find that R's functions will work to process things as a vector and then give output appropriate to that. BTW, without cat(), sprintf() will have a similar behavior, only it well return a character vector rather than printing things in the desired manner (BTW, if you want that printed to a file, the easiest way in R is with the sink() command, so don't bother with fprintf() or anything like that).

Log in to answer this question.