Convertir les noms de lignes en première colonne

147

J'ai une trame de données comme celle-ci:

df
              VALUE              ABS_CALL DETECTION P-VALUE    
    1007_s_at "957.729231881542" "P"      "0.00486279317241156"
    1053_at   "320.632701283368" "P"      "0.0313356324173416" 
    117_at    "429.842323161046" "P"      "0.0170004527476119" 
    121_at    "2395.7364289242"  "P"      "0.0114473584876183" 
    1255_g_at "116.493632746934" "A"      "0.39799368200131"   
    1294_at   "739.927122116896" "A"      "0.0668649772942343" 

Je veux convertir les noms de ligne dans la première colonne. Actuellement, j'utilise quelque chose comme ça pour créer des noms de lignes comme première colonne:

  d <- df
  names <- rownames(d)
  rownames(d) <- NULL
  data <- cbind(names,d)

Y a-t-il une seule ligne pour faire cela?

Agaz Hussain
la source
12
Vous n'avez pas besoin de paquets supplémentaires, voici un one-liner:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r
Le commentaire de @ ssp3nc3r devrait être une réponse acceptée
Hrant

Réponses:

119

Vous pouvez à la fois supprimer les noms de lignes et les convertir en colonne par référence (sans réallouer la mémoire à l'aide de ->) en utilisant setDTet son keep.rownames = TRUEargument du data.tablepackage

library(data.table)
setDT(df, keep.rownames = TRUE)[]
#    rn     VALUE  ABS_CALL DETECTION     P.VALUE
# 1:  1 1007_s_at  957.7292         P 0.004862793
# 2:  2   1053_at  320.6327         P 0.031335632
# 3:  3    117_at  429.8423         P 0.017000453
# 4:  4    121_at 2395.7364         P 0.011447358
# 5:  5 1255_g_at  116.4936         A 0.397993682
# 6:  6   1294_at  739.9271         A 0.066864977

Comme mentionné par @snoram, vous pouvez donner à la nouvelle colonne le nom que vous voulez, par exemple setDT(df, keep.rownames = "newname")ajouter "nouveau nom" comme colonne de lignes.

David Arenburg
la source
5
Utilisez colnames(df)[1] <- "newname"pour renommer la première colonne si nécessaire.
Swetabh
5
@Swetabh Eh bien, non. setnames(df, 1, "newname")est le data.tablechemin.
David Arenburg
@DavidArenburg Eh bien, (au moins) maintenant vous pouvez le faire dans le même appelsetDT(df, keep.rownames = "newname")[]
sindri_baldur
1
@DavidArenburg trouvé dans la documentation pour as.data.table(): Si TRUE, ajoute les noms de l'objet d'entrée dans une colonne distincte nommée "rn". keep.rownames = "id" nomme la colonne "id" à la place
sindri_baldur
1
@snoram bonne trouvaille, je vais faire un PR à ce sujet pour rendre la documentation cohérente.
David Arenburg
140

Ou vous pouvez utiliser dplyr's add_rownamesqui fait la même chose que la réponse de David:

library(dplyr)
df <- tibble::rownames_to_column(df, "VALUE")

MISE À JOUR (mi-2016): (incorporée à ce qui précède)

l'ancienne fonction appelée add_rownames()est obsolète et est remplacée par tibble::rownames_to_column()(mêmes fonctions, mais Hadley a été dplyrun peu remaniée ).

hrbrmstr
la source
14
Pas exactement la même chose, car il ne le fait pas par référence :)
David Arenburg
1
MISE À JOUR: la mise à jour de dplyr nécessite l'utilisation de tibble :: rownames_to_column () car dplyr :: rownames est obsolète.
EDennnis
C'est génial si l'on veut rester dans le tidyverse
Euler_Salter
83

Une option d'une ligne est:

df$names <- rownames(df)
Emilie
la source
12
J'espère que vous êtes conscient du fait qu'il s'ajoute rownamescomme colonne à la fin, en fait pas comme première colonne.
Agaz Hussain
30

Vous pouvez également créer une nouvelle trame de données (ou écraser la trame actuelle, comme dans l'exemple ci-dessous) afin de ne pas avoir besoin d'utiliser de package externe. Cependant, cette méthode peut ne pas être efficace avec d'énormes trames de données.

df <- data.frame(names = row.names(df), df)
drasc
la source
10
Ou:df <- cbind(names = rownames(df), df)
Mark Miller
15

J'ai déplacé mon commentaire dans une réponse par suggestion ci-dessus:

Vous n'avez pas besoin de paquets supplémentaires, voici un one-liner:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r
la source
4

dplyr::as_data_frame(df, rownames = "your_row_name") vous donnera un résultat encore plus simple.

SteveS
la source
2
@HectorHaffenden a édité ceci pour l'affiche, car c'est en fait une bonne suggestion.
Tjebo du
2

Ou en utilisant DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Agaz Hussain
la source