2014-09-05 68 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矩陣,其中包含正確的行和列名。