Converti i nomi delle righe nella prima colonna


147

Ho un frame di dati come questo:

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" 

Voglio convertire i nomi delle righe nella prima colonna. Attualmente uso qualcosa del genere per creare nomi di riga come prima colonna:

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

C'è una sola linea per farlo?



12
Non hai bisogno di pacchetti extra, ecco un one-liner:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r

Il commento di @ ssp3nc3r dovrebbe essere una risposta accettata
Hrant,

Risposte:


119

Puoi sia rimuovere i nomi delle righe sia convertirli in una colonna per riferimento (senza riallocare la memoria usando ->) usando setDTe il suo keep.rownames = TRUEargomento dal data.tablepacchetto

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

Come accennato da @snoram, puoi assegnare alla nuova colonna il nome che desideri, ad esempio setDT(df, keep.rownames = "newname")aggiungere "newname" come colonna delle righe.


5
Utilizzare colnames(df)[1] <- "newname"per rinominare la prima colonna, se necessario.
Swetabh,

5
@Swetabh Bene, no. setnames(df, 1, "newname")è il data.tablemodo.
David Arenburg,

@DavidArenburg Bene, (almeno) ora puoi farlo nella stessa chiamatasetDT(df, keep.rownames = "newname")[]
sindri_baldur

1
@DavidArenburg trovato nella documentazione per as.data.table(): Se TRUE, aggiunge i nomi dell'oggetto di input come colonna separata denominata "rn". keep.rownames = "id"
chiama

1
@snoram buona scoperta, farò un PR per quello per rendere i documenti coerenti.
David Arenburg,

140

Oppure si può usare dplyr's add_rownamesche fa la stessa cosa come la risposta di David:

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

AGGIORNAMENTO (metà 2016): (incorporato a quanto sopra)

la vecchia funzione chiamata add_rownames()è stata deprecata e viene sostituita da tibble::rownames_to_column()(stesse funzioni, ma Hadley ha riformulato dplyrun po ').


14
Non esattamente lo stesso, perché non lo sta facendo per riferimento :)
David Arenburg,

1
AGGIORNAMENTO: l'aggiornamento di dplyr richiede di utilizzare tibble :: rownames_to_column () poiché dplyr :: rownames è obsoleto.
EDennnis

Questo è fantastico se si vuole rimanere all'interno del riordino
Euler_Salter

83

Un'opzione su una riga è:

df$names <- rownames(df)

12
Spero che tu sia consapevole del fatto che alla fine si aggiunge rownamescome una colonna, anzi non come una prima colonna.
Agaz Hussain,

30

In alternativa, è possibile creare un nuovo frame di dati (o sovrascrivere quello corrente, come nell'esempio seguente) in modo da non dover utilizzare alcun pacchetto esterno. Tuttavia, in questo modo potrebbe non essere efficiente con enormi frame di dati.

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

10
Oppure:df <- cbind(names = rownames(df), df)
Mark Miller,

15

Spostato il mio commento in una risposta per suggerimento sopra:

Non hai bisogno di pacchetti extra, ecco un one-liner:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))

4

dplyr::as_data_frame(df, rownames = "your_row_name") ti darà un risultato ancora più semplice.


2
@HectorHaffenden lo ha modificato per il poster, perché in realtà è un bel suggerimento.
Tjebo,

2

O usando DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.