2017-08-05 103 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