2017-08-05 58 views
1

到行索引我有一個data.frame:轉換第一列data.frame中的R

 target_id sample1 sample10 sample100 sample101 sample102 sample103 
1: ENST00000000233  9  0 3499.51   0   0   0 
2: ENST00000000412  0  0  0.00   0   0   0 
3: ENST00000000442  0  0  0.00   0   0   0 
4: ENST00000001008  0  0  0.00   0   0   0 
5: ENST00000001146  0  0  0.00   0   0   0 
6: ENST00000002125  0  0  0.00   0   0   0 

我想將它轉換爲另一種data.frame,其中$ target_id將是一個行名稱。具體而言,我想在數字數據(從樣品列)執行聚類,然後能夠訪問它們的基因的實體(例如:ENST00000000233)

   sample1 sample10 sample100 sample101 sample102 sample103 
ENST00000000233  9  0 3499.51   0   0   0 
ENST00000000412  0  0  0.00   0   0   0 
ENST00000000442  0  0  0.00   0   0   0 
ENST00000001008  0  0  0.00   0   0   0 
ENST00000001146  0  0  0.00   0   0   0 
ENST00000002125  0  0  0.00   0   0   0 

是否有可能中的R創建這樣data.frame?

謝謝!

回答

3

首先您的數據示例。

mydf <- 
structure(list(target_id = c("ENST00000000233", "ENST00000000412", 
"ENST00000000442", "ENST00000001008", "ENST00000001146", "ENST00000002125" 
), sample1 = c(9L, 0L, 0L, 0L, 0L, 0L), sample10 = c(0L, 0L, 
0L, 0L, 0L, 0L), sample100 = c(3499.51, 0, 0, 0, 0, 0), sample101 = c(0L, 
0L, 0L, 0L, 0L, 0L), sample102 = c(0L, 0L, 0L, 0L, 0L, 0L), sample103 = c(0L, 
0L, 0L, 0L, 0L, 0L)), .Names = c("target_id", "sample1", "sample10", 
"sample100", "sample101", "sample102", "sample103"), class = "data.frame", row.names = c("1:", 
"2:", "3:", "4:", "5:", "6:")) 

現在的代碼。

result <- mydf[-1] 
row.names(result) <- mydf$target_id 
result 
       sample1 sample10 sample100 sample101 sample102 sample103 
ENST00000000233  9  0 3499.51   0   0   0 
ENST00000000412  0  0  0.00   0   0   0 
ENST00000000442  0  0  0.00   0   0   0 
ENST00000001008  0  0  0.00   0   0   0 
ENST00000001146  0  0  0.00   0   0   0 
ENST00000002125  0  0  0.00   0   0   0 

很簡單,不是嗎?

+0

謝謝你的答案的選項!當我運行'row.names(result)< - mydf $ target_id'時,出現錯誤:'row.names < - 。data.frame(* tmp *,value = c(「ENST00000000233」,: 無效的'row.names'長度' –

+0

我修正了這個錯誤,我的data.frame也有data.table類,所以我只把它保存爲data.frame –

0

它可以不定義一個新的變量來實現:

df <- data.frame(df[,-1], row.names = df[,1]) 


#     sample1 sample10 sample100 sample101 sample102 sample103 
# ENST00000000233  9  0 3499.51   0   0   0 
# ENST00000000412  0  0  0.00   0   0   0 
# ENST00000000442  0  0  0.00   0   0   0 
# ENST00000001008  0  0  0.00   0   0   0 
# ENST00000001146  0  0  0.00   0   0   0 
# ENST00000002125  0  0  0.00   0   0   0 
+0

謝謝你的建議,但不幸的是我得到了以下錯誤: 'df [,1]中的錯誤:'closure'類型的對象不能被子集化' –

+0

@OlhaKholod這就是爲什麼你需要提供一個[可重現的例子](https://stackoverflow.com/questions/5963269/how-to- make-a-great-r-reproducible-example)'dput(head(df,10))'這應該總是包含在你的問題中 – Masoud

+0

@OlhaKholod,'closure'類型的對象表示一個函數。正在使用'base R'函數的名字'''''''''''F'分佈的密度。改變'data.frame'的名字。包''data.table',你也應該避免使用'dt',出於同樣的原因。 –

0

下面是使用tidyverse

library(tidyverse) 
df1 %>% 
    remove_rownames() %>% 
    column_to_rownames(var = 'target_id') 
#    sample1 sample10 sample100 sample101 sample102 sample103 
#ENST00000000233  9  0 3499.51   0   0   0 
#ENST00000000412  0  0  0.00   0   0   0 
#ENST00000000442  0  0  0.00   0   0   0 
#ENST00000001008  0  0  0.00   0   0   0 
#ENST00000001146  0  0  0.00   0   0   0 
#ENST00000002125  0  0  0.00   0   0   0