Convierta los nombres de fila en la primera columna

147

Tengo un marco de datos como este:

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" 

Quiero convertir los nombres de fila en la primera columna. Actualmente utilizo algo como esto para hacer nombres de fila como la primera columna:

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

¿Hay una sola línea para hacer esto?

Agaz Hussain
fuente
12
No necesita paquetes adicionales, aquí hay una d <- cbind(rownames(d), data.frame(d, row.names=NULL))
frase
El comentario de @ ssp3nc3r debería ser una respuesta aceptada
Hrant

Respuestas:

119

Puede ambos nombres de las filas quitar y convertirlos a una columna de referencia (sin reasignación de memoria utilizando ->) utilizando setDTy su keep.rownames = TRUEargumento del data.tablepaquete

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

Como mencionó @snoram, puede darle a la nueva columna el nombre que desee, por ejemplo setDT(df, keep.rownames = "newname"), agregaría "nombre nuevo" como columna de filas.

David Arenburg
fuente
55
Use colnames(df)[1] <- "newname"para cambiar el nombre de la primera columna si es necesario.
Swetabh
55
@Swetabh Bueno, no. setnames(df, 1, "newname")es el data.tablecamino
David Arenburg el
@DavidArenburg Bueno, (al menos) ahora puedes hacerlo en la misma llamadasetDT(df, keep.rownames = "newname")[]
sindri_baldur
1
@DavidArenburg se encuentra en la documentación para as.data.table(): Si es VERDADERO, agrega los nombres del objeto de entrada como una columna separada llamada "rn". keep.rownames = "id" nombra la columna "id" en su lugar
sindri_baldur
1
@snoram buen hallazgo, haré un PR con respecto a eso para que los documentos sean consistentes.
David Arenburg
140

O puede usar dplyr's add_rownamesque hace lo mismo que la respuesta de David:

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

ACTUALIZACIÓN (mediados de 2016): (incorporado a lo anterior)

función antigua llamada add_rownames() ha quedado en desuso y está siendo reemplazada por tibble::rownames_to_column()(mismas funciones, pero Hadley refactorizó dplyrun poco).

hrbrmstr
fuente
14
No es exactamente lo mismo, porque no lo hace por referencia :)
David Arenburg
1
ACTUALIZACIÓN: la actualización de dplyr requiere que uno use tibble :: rownames_to_column () ya que dplyr :: rownames está en desuso.
EDennnis
Esto es genial si uno quiere permanecer dentro del tidyverse
Euler_Salter
83

Una opción de una línea es:

df$names <- rownames(df)
Emily
fuente
12
Espero que sea consciente del hecho de que se agrega rownamescomo una columna al final, de hecho no como una primera columna.
Agaz Hussain
30

Alternativamente, puede crear un nuevo marco de datos (o sobrescribir el actual, como el ejemplo a continuación) para que no necesite usar ningún paquete externo. Sin embargo, esta forma puede no ser eficiente con grandes marcos de datos.

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

Moví mi comentario a una respuesta por sugerencia anterior:

No necesita paquetes adicionales, aquí hay una línea:

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

dplyr::as_data_frame(df, rownames = "your_row_name") te dará un resultado aún más simple.

SteveS
fuente
2
@HectorHaffenden ha editado esto para el póster, porque en realidad es una buena sugerencia.
Tjebo
2

O al usar DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Agaz Hussain
fuente