Say you want to convert a matrix to a list, where each element of the list contains one column. list()
or as.list()
obviously won't work, and until now I use a hack using the behaviour of tapply
:
x <- matrix(1:10,ncol=2) tapply(x,rep(1:ncol(x),each=nrow(x)),function(i)i)
I'm not completely happy with this. Anybody knows a cleaner method I'm overlooking?
(for making a list filled with the rows, the code can obviously be changed to :
tapply(x,rep(1:nrow(x),ncol(x)),function(i)i)
)
The as. list() is an inbuilt function that takes an R language object as an argument and converts the object into a list. We have used this function to convert our matrix to a list. These objects can be Vectors, Matrices, Factors, and data frames.
Functions Used data-is the input vector which becomes the data elements of the matrix. nrow-is the numbers of rows to be created. ncol-is the numbers of columns to be created. byrow-is a logical clue,if it is true then input vector elements are arranged by row.
Conversion of a Matrix into a Row Vector. This conversion can be done using reshape() function along with the Transpose operation. This reshape() function is used to reshape the specified matrix using the given size vector.
Gavin's answer is simple and elegant. But if there are many columns, a much faster solution would be:
lapply(seq_len(ncol(x)), function(i) x[,i])
The speed difference is 6x in the example below:
> x <- matrix(1:1e6, 10) > system.time( as.list(data.frame(x)) ) user system elapsed 1.24 0.00 1.22 > system.time( lapply(seq_len(ncol(x)), function(i) x[,i]) ) user system elapsed 0.2 0.0 0.2
In the interests of skinning the cat, treat the array as a vector as if it had no dim attribute:
split(x, rep(1:ncol(x), each = nrow(x)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With