[UPDATE: there is now a native transpose() function in data.table package]
I often need to transpose a data.table, every time it takes several lines of code and I am wondering if there's any better solution than mine.
if we take sample table
library(data.table) mydata <- data.table(col0=c("row1","row2","row3"), col1=c(11,21,31), col2=c(12,22,32), col3=c(13,23,33)) mydata # col0 col1 col2 col3 # row1 11 12 13 # row2 21 22 23 # row3 31 32 33 and just transpose it with t(), it will be transposed to the matrix with conversion to character type, while applying data.table to such matrix will lose row.names:
t(mydata) # [,1] [,2] [,3] # col0 "row1" "row2" "row3" # col1 "11" "21" "31" # col2 "12" "22" "32" # col3 "13" "23" "33" data.table(t(mydata)) # V1 V2 V3 # row1 row2 row3 # 11 21 31 # 12 22 32 # 13 23 33 so I had to write a function for this:
tdt <- function(inpdt){ transposed <- t(inpdt[,-1,with=F]); colnames(transposed) <- inpdt[[1]]; transposed <- data.table(transposed, keep.rownames=T); setnames(transposed, 1, names(inpdt)[1]); return(transposed); } tdt(mydata) # col0 row1 row2 row3 # col1 11 21 31 # col2 12 22 32 # col3 13 23 33 is there anything I could optimize here or do it in "nicer" way?
data.table? Transposing is a natural operation for numeric matrices but I have a hard time thinking of problems where it would be a good idea to transpose a by-definition non-uniform object like adata.tableor adata.frame. Care to give an example?data.tableis quite logical for me. Most typical example would be the table where each column is a sample and each row is a probe; characteristics of probes and/or samples are recorded in the same table.data.tablefunctiontranspose, it might be worth re-considering what answer to accept.