【发布时间】:2015-04-23 14:25:30
【问题描述】:
[更新:data.table 包中现在有一个原生的transpose() 函数]
我经常需要转置一个data.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
只需用t()转置它,它就会转置到矩阵并转换为character类型,而将data.table应用于该矩阵将丢失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
所以我不得不为此编写一个函数:
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
有什么我可以在这里优化或以“更好”的方式做的吗?
【问题讨论】:
-
我很好奇你为什么需要转置
data.table?转置是数值矩阵的自然运算,但我很难考虑转置定义非统一对象(如data.table或data.frame)的问题。愿意举个例子吗? -
好吧,我的大部分实验数据文件都是表格,其中主要部分确实是数字矩阵,但伴随着几个非数字字段,所以使用
data.table对我来说很合乎逻辑。最典型的例子是表格,每列是一个样本,每一行是一个探针;探针和/或样品的特性记录在同一张表中。 -
你可以用 header = FALSE fread 然后使用转置吗?
-
@eddi 转置 data.frame 的一个例子:在单细胞基因组学中存在两种存储数据的概念。一种是基因在行中,细胞在列中,一种反之亦然。所以如果你想使用不同的软件包,你需要转置..
-
鉴于现在有原生
data.table函数transpose,可能值得重新考虑接受什么答案。
标签: r data.table