2014-09-05 70 views
1

我有一个尺寸为3695 X 20的数据框。第一列包含字母数字标识符,其他19列均为数字。因此,rownames(df)提供数字1-3695,而colnames(df)提供列的名称。 df [,1]提供字母数字标识符。将数据帧转换为矩阵,并将第1列的df作为矩阵的rownames

我想将数据框转换为矩阵,并使用现有数据框的第1列作为新矩阵的rownames,并将数据框的列名称作为矩阵的列名。

我也想自动化这个过程,用于类似但不同维度的数据帧。因此,如果解决方案需要知道行数和/或列数,那么我怎样才能将这些信息放入代码中,而无需查看显示器?

我看过data.matrix和reshape2,但似乎无法弄清楚如何做我想做的事。

+0

等待你说第一列包含标识符,但也包含'rownames(df)'标识符。有不一样的东西。 'rownames()'不作为列存储,它们作为属性存储。那么你的数据的情况如何?你是否简单地复制了信息。你真的应该添加一个[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)来明确你的输入是什么以及你想要什么输出是。如果这是唯一的问题,您可以使用dim(),nrow()或ncol()来获取data.frame的维度。 – MrFlick 2014-09-05 21:56:19

+0

对不起,我的错误,rownames(df)只是一个数字列表; 1-3695。 – Matthew 2014-09-05 22:37:49

+0

如果在你的问题中有错误,你应该编辑它。再说一遍,如果没有一个可重复的例子,回答并不是很有趣,因为我们最终会浪费大量时间来创建一个,而我们的数据可能会或可能不会匹配您的数据。参见[如何提出一个好问题](http://stackoverflow.com/help/how-to-ask)。 – MrFlick 2014-09-05 22:47:47

回答

8

与样品数据

X<-structure(list(gene = c("AT1G01040", "AT1G01270", "AT1G01471", "AT1G01680"), log2.fold_change._Mer7_2.1_Mer7_2.2 = c(0, 0, 0, 0), log2.fold_change._Mer7_1.2_W29_S226A_1 = c(0, 0, -1.14, 0), log2.fold_change._Mer7_1.2_W29_1 = c(0, 0, 0, 0)), .Names = c("gene", "log2.fold_change._Mer7_2.1_Mer7_2.2", "log2.fold_change._Mer7_1.2_W29_S226A_1", "log2.fold_change._Mer7_1.2_W29_1"), row.names = c(NA, 4L), class = "data.frame") 

您可以编写一个简单的辅助函数来创建一个矩阵并设置正确的名称

matrix.please<-function(x) { 
    m<-as.matrix(x[,-1]) 
    rownames(m)<-x[,1] 
    m 
} 

,你会使用它像

M <- matrix.please(X) 
str(M) 
# num [1:4, 1:3] 0 0 0 0 0 0 -1.14 0 0 0 ... 
# - attr(*, "dimnames")=List of 2 
# ..$ : chr [1:4] "AT1G01040" "AT1G01270" "AT1G01471" "AT1G01680" 
# ..$ : chr [1:3] "log2.fold_change._Mer7_2.1_Mer7_2.2" 
# "log2.fold_change._Mer7_1.2_W29_S226A_1" "log2.fold_change._Mer7_1.2_W29_1" 

所以我们有一个4x3矩阵,其中包含正确的行和列名。