Converter nomes de linhas na primeira coluna

147

Eu tenho um quadro de dados 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" 

Quero converter os nomes das linhas na primeira coluna. Atualmente, uso algo assim para criar nomes de linhas como a primeira coluna:

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

Existe uma única linha para fazer isso?

Agaz Hussain
fonte
12
Você não precisa de pacotes extras, aqui está uma lista:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r 6/17
O comentário do @ ssp3nc3r deve ser uma resposta aceita
Hrant

Respostas:

119

Você pode ambos os nomes de linha remover e convertê-los em uma coluna por referência (sem realocação de memória usando ->) usando setDTe seu keep.rownames = TRUEargumento do data.tablepacote

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 mencionado por @snoram, você pode dar à nova coluna o nome que quiser, por exemplo setDT(df, keep.rownames = "newname"), adicionaria "newname" como a coluna de linhas.

David Arenburg
fonte
5
Use colnames(df)[1] <- "newname"para renomear a primeira coluna, se necessário.
Swetabh
5
@ Swetabh Bem, não. setnames(df, 1, "newname")é o data.tablecaminho.
precisa
@DavidArenburg Bem, (pelo menos) agora você pode fazê-lo na mesma chamada #setDT(df, keep.rownames = "newname")[]
sindri_baldur
1
O @DavidArenburg encontrado na documentação para as.data.table(): Se TRUE, adiciona os nomes do objeto de entrada como uma coluna separada chamada "rn". keep.rownames = "id" nomeia a coluna "id" em vez disso
sindri_baldur 05/02/19
1
@ Snoram boa descoberta, vou fazer um PR sobre isso para tornar os documentos consistentes.
David Arenburg
140

Ou você pode usar dplyro add_rownamesque faz a mesma coisa que a resposta de David:

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

UPDATE (meados de 2016): (incorporado ao acima)

a função antiga chamada add_rownames()foi preterida e está sendo substituída por tibble::rownames_to_column()(mesmas funções, mas Hadley refatorou dplyrum pouco).

hrbrmstr
fonte
14
Não exatamente o mesmo, porque ele não está fazendo isso por referência :)
David Arenburg
1
ATUALIZAÇÃO: a atualização do dplyr requer que você use tibble :: rownames_to_column (), pois o dplyr :: rownames está obsoleto.
Edennnis 13/05/19
Isso é ótimo se alguém quiser ficar dentro do arrumado
Euler_Salter
83

Uma opção de uma linha é:

df$names <- rownames(df)
Emily
fonte
12
Espero que você esteja ciente do fato de que ele é adicionado rownamescomo uma coluna no final, e não como uma primeira coluna.
Agaz Hussain 18/03/16
30

Como alternativa, você pode criar um novo quadro de dados (ou substituir o atual, como no exemplo abaixo), para não precisar usar nenhum pacote externo. No entanto, esse caminho pode não ser eficiente com grandes quadros de dados.

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

Movi meu comentário para uma resposta por sugestão acima:

Você não precisa de pacotes extras, aqui está uma lista:

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

dplyr::as_data_frame(df, rownames = "your_row_name") lhe dará um resultado ainda mais simples.

SteveS
fonte
2
O @HectorHaffenden editou isso para o pôster, porque na verdade é uma boa sugestão.
Tjebo 26/07/19
2

Ou usando DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Agaz Hussain
fonte