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.