Convierta los valores en una columna en nombres de fila en un marco de datos existente en R

108

Me gustaría convertir los valores en una columna de un marco de datos existente en nombres de fila. ¿Es posible hacer esto sin exportar el marco de datos y luego volver a importarlo con una row.names =llamada?

Por ejemplo, me gustaría convertir:

 > samp 
     names Var.1 Var.2 Var.3
 1     A     1     5     0
 2     B     2     4     1
 3     C     3     3     2
 4     D     4     2     3
 5     E     5     1     4

dentro:

> samp.with.rownames 
     Var.1 Var.2 Var.3
A     1     5     0
B     2     4     1
C     3     3     2
D     4     2     3
E     5     1     4

Gracias

DQdlM
fuente

Respuestas:

135

Esto debería hacer:

samp2 <- samp[,-1]
rownames(samp2) <- samp[,1]

En resumen, no, no hay alternativa a la reasignación.

Editar: corrigiéndome, uno también puede hacerlo en su lugar: asignar atributos de nombre de fila, luego eliminar la columna:

R> df<-data.frame(a=letters[1:10], b=1:10, c=LETTERS[1:10])
R> rownames(df) <- df[,1]
R> df[,1] <- NULL
R> df
   b c
a  1 A
b  2 B
c  3 C
d  4 D
e  5 E
f  6 F
g  7 G
h  8 H
i  9 I
j 10 J
R> 
Dirk Eddelbuettel
fuente
4
> rownames (df) <- df [, 1] Error en row.names<-.data.frame( *tmp*, value = value): longitud de 'row.names' no válida Además: Mensaje de advertencia: la configuración de nombres de fila en un tibble está obsoleta.
user3673
36

A partir de 2016 también puede utilizar el tidyverse.

library(tidyverse)
samp %>% remove_rownames %>% column_to_rownames(var="names")
Joe
fuente
1
Más específicamente, lo estibble::column_to_rownames
Ott Toomet
1
Recibo una advertencia "La configuración de nombres de filas en un tibble está obsoleta"
Quantum7
1
La visualización tibble no muestra los nombres de fila, sin embargo, para verlo, debe canalizarlo a as.data.frame ()samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo
22

en una línea

> samp.with.rownames <- data.frame(samp[,-1], row.names=samp[,1])
nigelhenry
fuente
11

Puede ejecutar esto en 2 declaraciones simples:

row.names(samp) <- samp$names
samp[1] <- NULL
victor8910
fuente
Funciona en R 3.5.3
TheSciGuy
5

Parece que el one-liner se volvió aún más simple a lo largo de la línea (actualmente usando R 3.5.3):

# generate original data.frame
df <- data.frame(a = letters[1:10], b = 1:10, c = LETTERS[1:10])
# use first column for row names
df <- data.frame(df, row.names = 1)

La columna utilizada para los nombres de las filas se elimina automáticamente.

stragu
fuente