2014-05-24 5 views
5

Recentemente ho riscontrato il seguente problema nel mio codice R. In una funzione, accettando un frame di dati come argomento, avevo bisogno di aggiungere (o sostituire, se esiste) una colonna con i dati calcolati in base ai valori della colonna originale del frame di dati. Ho scritto il codice, ma i test hanno rivelato che il quadro dati operazioni di estrazione/sostituzione, che ho utilizzato, ha provocato una perdita degli attributi speciali (definiti dall'utente) dell'oggetto.Approcci alla conservazione degli attributi dell'oggetto durante le operazioni di estrazione/sostituzione

Dopo aver capito che, e confermando che il comportamento con la lettura di documentazione R (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.html), ho deciso di risolvere il problema in modo molto semplice - per salvando gli attributi prima che l'estratto/sostituire le operazioni e ripristino loro seguito:

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

Questo approccio ha funzionato. Tuttavia, per caso, mi sono imbattuto in un altro pezzo di documentazione R (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Extract.data.frame.html), che offre IMHO un interessante (e, potenzialmente, un più generico?) approccio alternativo per risolvere lo stesso problema:

## 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" 

lo farei Apprezzo molto se la gente qui potrebbe aiutare:

  1. Confrontando i due approcci di cui sopra, se sono paragonabili (mi rendo conto che il secondo approccio, come definito è per frame di dati, ma ho il sospetto che possa essere generalizzato a nessuno oggetto);

  2. Spiegazione la sintassi e significato nella definizione della funzione nel secondo approccio, soprattutto as.data.frame.avector, così come quello che è lo scopo della linea as.data.frame.avector <- as.data.frame.vector.

risposta

2

sto rispondendo alla mia domanda, dal momento che ho appena trovato un SO domanda (How to delete a row from a data.frame without losing the attributes), cui risposte coprire la maggior parte delle mie domande poste in precedenza. Tuttavia, ulteriori spiegazioni (per i principianti R) per il metodo secondo sarebbero comunque apprezzate.

UPDATE:

Un'altra soluzione a questo problema è stata proposta in una risposta alla seguente domanda SO: indexing operation removes attributes. Personalmente, tuttavia, mi piace l'approccio, basato sulla creazione di una nuova classe, poiché IMHO è semanticamente più pulito.

+1

L'autore della domanda collegata afferma che l'approccio del solo "salvataggio e ripristino degli attributi" (il "primo approccio" nella terminologia della mia domanda) non funziona. Tuttavia, sembra funzionare per me e mi chiedo cosa mi manca. –

Problemi correlati