Konvertieren Sie Zeilennamen in die erste Spalte

146

Ich habe einen Datenrahmen wie diesen:

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" 

Ich möchte die Zeilennamen in die erste Spalte konvertieren. Derzeit verwende ich so etwas, um Zeilennamen als erste Spalte zu erstellen:

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

Gibt es eine einzige Zeile, um dies zu tun?

Agaz Hussain
quelle
Mögliches Duplikat von R: Konvertieren von
Zeilennamen
12
Sie brauchen keine zusätzlichen Pakete, hier ist ein d <- cbind(rownames(d), data.frame(d, row.names=NULL))
Einzeiler
Der Kommentar von @ ssp3nc3r sollte eine akzeptierte Antwort sein
Hrant

Antworten:

119

Sie können Zeilennamen sowohl entfernen als auch in eine Spalte konvertieren, indem Sie sie mit ihrem Argument aus dem Paket referenzieren (ohne den Speicher neu zuzuweisen ->)setDTkeep.rownames = TRUEdata.table

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

Wie von @snoram erwähnt, können Sie der neuen Spalte einen beliebigen Namen geben, z. B. setDT(df, keep.rownames = "newname")"newname" als Zeilenspalte hinzufügen.

David Arenburg
quelle
5
Verwenden Sie colnames(df)[1] <- "newname"diese Option, um die erste Spalte bei Bedarf umzubenennen.
Swetabh
5
@ Swetabh Nun, nein. setnames(df, 1, "newname")ist der data.tableWeg.
David Arenburg
@ DavidArenburg Nun, (zumindest) jetzt können Sie es im gleichen Anruf tunsetDT(df, keep.rownames = "newname")[]
sindri_baldur
1
@DavidArenburg in der Dokumentation für as.data.table(): Wenn TRUE, werden die Namen des Eingabeobjekts als separate Spalte mit dem Namen "rn" hinzugefügt. keep.rownames = "id" benennt stattdessen die Spalte "id"
sindri_baldur
1
@snoram guter Fund, ich mache eine PR dazu, um die Konsistenz der Dokumente zu gewährleisten.
David Arenburg
140

Oder Sie können dplyr's add_rownamesverwenden, die dasselbe tun wie Davids Antwort:

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

UPDATE (Mitte 2016): (oben aufgenommen)

Die alte aufgerufene Funktion add_rownames()ist veraltet und wird ersetzt durch tibble::rownames_to_column()(dieselben Funktionen, aber Hadley hat sie dplyrein wenig überarbeitet ).

hrbrmstr
quelle
14
Nicht genau das gleiche, weil es nicht durch Referenz tut :)
David Arenburg
1
UPDATE: Für die Aktualisierung von dplyr muss tibble :: rownames_to_column () verwendet werden, da dplyr :: rownames veraltet ist.
EDennnis
Das ist großartig, wenn man in der Tidyverse bleiben will
Euler_Salter
83

Eine einzeilige Option ist:

df$names <- rownames(df)
Emily
quelle
12
Ich hoffe, Sie sind sich der Tatsache bewusst, dass es rownamesals letzte Spalte hinzugefügt wird, in der Tat nicht als erste Spalte.
Agaz Hussain
30

Alternativ können Sie einen neuen Datenrahmen erstellen (oder den aktuellen überschreiben, wie im folgenden Beispiel gezeigt), sodass Sie kein externes Paket verwenden müssen. Dieser Weg ist jedoch bei großen Datenrahmen möglicherweise nicht effizient.

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

Mein Kommentar wurde in eine Antwort gemäß dem obigen Vorschlag verschoben:

Sie benötigen keine zusätzlichen Pakete, hier ist ein Einzeiler:

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

dplyr::as_data_frame(df, rownames = "your_row_name") Sie erhalten ein noch einfacheres Ergebnis.

SteveS
quelle
2
@HectorHaffenden haben dies für das Poster bearbeitet, weil es eigentlich ein netter Vorschlag ist.
Tjebo
2

Oder mit DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Agaz Hussain
quelle