Ronald Bielester
Ronald Bielester

Reputation: 45

Putting output in R into excel

Guys I have a code that generates 2 columns of data (e.g Number, Median) which refers to a particular person...but I have taken samples of 7 people so basically I get this output:

[[1]
Number Median
1       5
2       3  
.....
[[2]]
Number Median
1       6
2       4
....
[[3]]
Number Median
1       3
2       5

So I basically get this output....up til [[7]] I tried transferring this output in excel using this code

write.csv(cbind(data),"data1.csv")

and I get this type of output:

list(c(Median =.......It lists all the median on the rows

But I want it to save the data referring to the 'median' and 'Number' in columns NOT ROWS

If I just type

write.csv(data,"data1.csv")

I get an error

arguments imply differing number of rows: 157, 179, 178, 180

Upvotes: 0

Views: 5094

Answers (2)

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193517

Here are two options. Both use the following sample data:

myList <- list(data.frame(matrix(1:4, ncol = 2)),
               data.frame(matrix(3:10, ncol = 2)),
               data.frame(matrix(11:14, ncol =2)))
myList
# [[1]]
#   X1 X2
# 1  1  3
# 2  2  4
# 
# [[2]]
#   X1 X2
# 1  3  7
# 2  4  8
# 3  5  9
# 4  6 10
# 
# [[3]]
#   X1 X2
# 1 11 13
# 2 12 14

Option 1: Write a csv file where the data.frames are presented as they are in the list

sink("list_of_dataframes.csv", type="output")
invisible(lapply(myList, function(x) dput(write.csv(x))))
sink()

If you open the resulting "list_of_dataframes.csv" file in a text editor, you will get something that looks like this. When you read this into a spreadsheet program, the first column will include the rownames and NULL separating each data.frame:

"","X1","X2"
"1",1,3
"2",2,4
NULL
"","X1","X2"
"1",3,7
"2",4,8
"3",5,9
"4",6,10
NULL
"","X1","X2"
"1",11,13
"2",12,14
NULL

Option 2: Write or search around for a version of cbind that accommodates binding data.frames with differing number of rows.

Here is one such function that I've written.

cbind2 <- function(datalist) {
  nrows <- max(sapply(datalist, nrow))
  expandmyrows <- function(mydata, rowsneeded) {
    temp1 = names(mydata)
    rowsneeded = rowsneeded - nrow(mydata)
    temp2 = setNames(data.frame(
      matrix(rep(NA, length(temp1) * rowsneeded),
             ncol = length(temp1))), temp1)
    rbind(mydata, temp2)
  }
  do.call(cbind, lapply(datalist, expandmyrows, rowsneeded = nrows))
}

And here is that function applied to your list:

cbind2(myList)
#   X1 X2 X1 X2 X1 X2
# 1  1  3  3  7 11 13
# 2  2  4  4  8 12 14
# 3 NA NA  5  9 NA NA
# 4 NA NA  6 10 NA NA

That output should be easy for you to use with write.csv and related functions.

Upvotes: 0

Se&#241;or O
Se&#241;or O

Reputation: 17412

As Marius said, you have a list of data.frames which can't be written to a .csv file. You need to do:

NewDataFrame <- do.call("rbind", YourList)
write.csv(NewDataFrame, "Data.csv")

do.call takes each of the elements from a list and applies whatever function you tell it (in this case rbind) to all of them.

Upvotes: 2

Related Questions