2014-05-24 5 views
5

Kürzlich ist das folgende Problem in meinem R-Code aufgetreten. In einer Funktion, die einen Datenrahmen als Argument akzeptiert, musste ich eine Spalte mit Daten, die basierend auf den Werten der ursprünglichen Spalte des Datenrahmens berechnet wurden, hinzufügen (oder ersetzen, falls vorhanden). Ich schrieb den Code, aber die Prüfung ergab, dass Datenrahmen extrahieren/ersetzen Operationen, die ich verwendet habe, führte zu einem Verlust der speziellen (benutzerdefinierten) Attribute des Objekts.Ansätze zum Beibehalten von Objektattributen beim Extrahieren/Ersetzen von Operationen

Danach realisieren und dieses Verhalten bestätigt durch R Lesen der Dokumentation (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.html), entschied ich mich sehr einfach, das Problem zu lösen - durch die Attribute vor dem Extrakt Speichern/Ersetzen-Operationen und Wiederherstellung sie danach:

myTransformationFunction <- function (data) { 

    # save object's attributes 
    attrs <- attributes(data) 

    <data frame transformations; involves extract/replace operations on `data`> 

    # restore the attributes 
    attributes(data) <- attrs 

    return (data) 
} 

Dieser Ansatz funktionierte. Doch aus Versehen, lief ich über ein anderes Stück R Dokumentation (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.data.frame.html), das bietet meine Meinung nach einer interessanten (und möglicherweise auch eine allgemeinere?) alternativer Ansatz auf das gleiche Problem zu lösen:

## keeping special attributes: use a class with a 
## "as.data.frame" and "[" method: 

as.data.frame.avector <- as.data.frame.vector 

`[.avector` <- function(x,i,...) { 
    r <- NextMethod("[") 
    mostattributes(r) <- attributes(x) 
    r 
} 

d <- data.frame(i = 0:7, f = gl(2,4), 
       u = structure(11:18, unit = "kg", class = "avector")) 
str(d[2:4, -1]) # 'u' keeps its "unit" 

würde ich ,

  1. die beiden oben genannten Ansätze Vergleich, wenn sie vergleichbar sind (ich weiß, dass der zweite Ansatz für Datenrahmen definiert ist, aber ich vermute, dass es sein kann: wirklich zu schätzen, wenn die Menschen hier helfen könnte durch verallgemeinert zu irgendwelchen Objekt);

  2. Erklären die Syntax und die Bedeutung in der Definition der Funktion im zweiten Ansatz, vor allem as.data.frame.avector, als auch, was ist der Zweck der Linie as.data.frame.avector <- as.data.frame.vector.

Antwort

2

ich meine eigene Frage zu beantworten, da ich nur eine Frage SO (How to delete a row from a data.frame without losing the attributes) gefunden, Antworten auf denen decken meisten meiner oben gestellten Fragen. Zusätzliche Erläuterungen (für R-Einsteiger) für den zweiten Ansatz würden jedoch immer noch geschätzt werden.

UPDATE:

Eine andere Lösung für dieses Problem in einer Antwort auf die folgende Frage SO vorgeschlagen wurde: indexing operation removes attributes. Persönlich mag ich jedoch den Ansatz, der auf der Erstellung einer neuen Klasse basiert, da es IMHO semantisch sauberer ist.

+1

Der Autor der verknüpften Frage besagt, dass der Ansatz, nur Attribute zu speichern und wiederherzustellen (der "erste Ansatz" in der Terminologie meiner Frage), nicht funktioniert. Aber es scheint für mich zu funktionieren und ich frage mich, was ich vermisse. –

Verwandte Themen