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?


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.


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


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)

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)

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

4

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.