web-dev-qa-db-fra.com

Convertir les noms de lignes dans la première colonne

J'ai un cadre de données comme ceci:

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 ceci pour créer des noms de ligne dans la 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?

104
Agaz Hussain

Vous pouvez les deux supprimer les noms de ligne et les convertir en colonne par référence (sans réaffecter la mémoire à l'aide de ->) à l'aide de setDT et de son keep.rownames = TRUE argument du package data.table

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 attribuer à la nouvelle colonne le nom de votre choix, par exemple. setDT(df, keep.rownames = "newname") ajouterait "newname" comme colonne de lignes.

90
David Arenburg

Ou vous pouvez utiliser add_rownames de dplyr qui fait la même chose que la réponse de David:

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

UPDATE (mi-2016): (incorporé à ce qui précède)

l'ancienne fonction appelée add_rownames() est devenue obsolète et est remplacée par tibble::rownames_to_column() (mêmes fonctions, mais Hadley a refactorisé dplyr un bit).

101
hrbrmstr

Une option d'une ligne est:

df$names <- rownames(df)
63
Emily

Sinon, vous pouvez créer une nouvelle image (ou écraser l'image actuelle, comme dans l'exemple ci-dessous), de sorte que vous n'avez pas besoin d'utiliser de package externe. Cependant, cette façon peut ne pas être efficace avec des trames de données énormes.

df <- data.frame(names = row.names(df), df)
19
drasc

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))
4
ssp3nc3r

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

1
SteveS