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?



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.


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).


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)

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)

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

4

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.