2017-08-05 2 views
1

J'ai un data.frame:convertir la première colonne en data.frame à la ligne index 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 

Je voudrais le convertir à une autre data.frame, où target_id $ sera un nom de ligne. Plus précisément, je veux effectuer le regroupement des données numériques (de colonnes échantillon) et être en mesure d'accéder à leurs entités de gènes (par exemple: 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 

Est-il possible de créer un tel data.frame en R?

Merci!

Répondre

3

D'abord votre exemple de données.

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:")) 

Maintenant le code.

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 

Simple, non?

+0

Merci pour votre réponse! Quand j'ai couru 'row.names (résultat) <- mydf $ target_id', j'ai eu une erreur:' Erreur dans row.names <-. Data.frame (* tmp *, valeur = c ("ENST00000000233",: invalide 'row.names' length' –

+0

Je corrige cette erreur Mon data.frame avait aussi la classe data.table, donc je l'enregistre seulement comme data.frame –

0

Il peut être réalisé sans définir une nouvelle variable:

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

Merci pour votre suggestion, mais, malheureusement, j'ai eu l'erreur suivante: 'Erreur dans df [, 1]: l'objet de type 'closure' n'est pas sous-mémorisable –

+0

@OlhaKholod C'est pourquoi vous devez fournir un [exemple reproductible] (https://stackoverflow.com/questions/5963269/how-to- make-a-great-r-reproducible-example). 'dput (head (df, 10))' ceci devrait toujours être inclus dans votre question – Masoud

+0

@OlhaKholod, 'objet de type 'closure'' signifie une fonction. utilisez le nom d'une fonction 'base R',' df', la densité de la distribution 'F'. Changez le nom de votre' data.frame'. Dans le paquet 'data.table', vous devriez aussi éviter 'dt', pour la même raison. –

0

est ici une option à l'aide 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