2016-07-19 7 views
17

In der R-Core-Bibliothek gibt es zwei Funktionen.Warum wird `row.names` gegenüber` rownames` bevorzugt?

  • row.namesGet und Set Row Namen für Datenrahmen
  • rownamesdie Zeilennamen einer matrixartigen Objekt abrufen oder einstellen.

jedoch die Dokumentation für row.namesfür einen Datenrahmen gibt, ‚rownames‘ und ‚COLNAMES‘ schließlich ‚row.names‘ nennen und die Namen 'jeweils, aber die letzteren sind bevorzugt. Warum wird row.names bevorzugt? Wäre es nicht einfacher, einfach row.names zu ignorieren und einfach rownames anzurufen?

+2

Mögliche Duplikate von [Was ist der Unterschied zwischen rownames() und row.names() in R?] (Http://stackoverflow.com/questions/33882782/what-is-the-difference-with-own-own-) und-row-names-in-r) – Noah

+4

Dieser Link hilft überhaupt nicht. –

+3

@RichardScriven Wenn diese Frage eine gute Antwort erhält, sollte diese andere Frage möglicherweise als ein Duplikat dieser Frage geschlossen werden. –

Antwort

7

row.names() ist eine generische S3-Funktion, während rownames() eine nicht generische Funktion der unteren Ebene ist. rownames() ist in der Tat die Standardmethode für row.names(), die auf ein beliebiges Objekt angewendet wird, wenn eine spezifischere Methode fehlt.

Wenn Sie mit einem Datenrahmen x arbeiten, ist es effizienter, row.names(x) zu verwenden, da es eine spezielle row.names()-Methode für Datenrahmen gibt. Die row.names()-Methode für Datenrahmen extrahiert einfach das "row.names"-Attribut, das bereits in x gespeichert ist. Aufgrund der Definition von rownames() und der wechselseitigen Beziehungen zwischen den Funktionen muss rownames(x) alle Dimensionsnamen von x extrahieren, dann die Spaltennamen löschen, dann mit names(x) kombinieren und dann wieder names(x) löschen. Dieser Prozess beinhaltet sogar einen Aufruf an row.names(x) als Zwischenschritt. Dies geschieht normalerweise so schnell, dass Sie es nicht bemerken, aber das Attribut einfach zu extrahieren ist offensichtlich effizienter.

Wenn Sie die beiden Funktionen nicht unterscheiden wollen, dann wäre es logisch, immer nur die generische Version row.names() zu verwenden, da sie immer die entsprechende Methode ausgibt. Beispiel: Wenn x eine Matrix ist, wird row.names(x) nur sauber an rownames(x) übergeben, da es keine spezifischere Methode für diese Objektklasse gibt.

Verwandte Themen