Qual è un buon uso della funzione 'comment' in R?


35

Ho appena scoperto la commentfunzione in R. Esempio:

x <- matrix(1:12, 3,4)
comment(x) <- c("This is my very important data from experiment #0234",
                "Jun 5, 1998")
x
comment(x)

Questa è la prima volta che mi è venuta questa funzione e mi chiedevo quali siano gli usi comuni / utili di essa. Poiché è abbastanza difficile cercare "R comment" in google e trovare risultati pertinenti, speravo che qualcuno qui potesse condividere con la sua esperienza.


3
Non penso che questa domanda debba davvero essere una CW. È borderline, ma non è poi così male.
csgillespie,

ottima informazione! (il pacchetto di serie storiche 'xts' ha questa funzionalità di metadati simile.)
Doug

2
Questa domanda è stata suggerita per la chiusura: se la domanda è ampiamente interpretata (e nota che praticamente nessuna delle risposte è specifica per R), questa è davvero una domanda su quando e perché si vorrebbe etichettare colonne di dati. Questo tipo di problema di gestione dei dati è chiaramente una parte regolare della pratica statistica, quindi è probabilmente in argomento qui.
Silverfish,

Risposte:


15

Secondo secondo @Gavin, Frank Harrell ha sviluppato modi efficienti per gestire dati.frame annotati in R nel suo pacchetto Hmisc . Ad esempio, le funzioni label()e units()consentono di aggiungere attributi dedicati agli oggetti R. Li trovo molto utili quando si produce un riepilogo di data.frame (ad esempio, con describe()).

Un altro modo utile di utilizzare un tale attributo extra è applicare un timestamp su un set di dati. Aggiungo anche un attributo per cose come seed casuali, numero di piega (quando utilizzo k-kold o LOO cross-validation).


14

Una cosa che mi trovo spesso a fare nei miei script R per una particolare attività di analisi dei dati è quella di includere commenti nello script sulle unità di variabili nei miei frame di dati. Lavoro con dati ambientali e chimici ed ecologi sembrano divertirsi usando una vasta gamma di unità diverse per le stesse cose (mg L vs mu eq L , ecc.). I miei colleghi di solito memorizzano queste informazioni nella riga immediatamente sotto i nomi delle colonne nei fogli di Excel.-1-1

Vedrei comment()come un bel modo di allegare queste informazioni a un frame di dati per riferimento futuro.


2
La soluzione standard è quella di includere un campo per le unità di misura, in modo che il computer possa essere programmato per convertire tutti i risultati numerici in unità comuni (specifiche dei parametri). Seppellire queste informazioni cruciali nei commenti rende difficile o impossibile implementare questa capacità.
whuber

2
@whuber ma R non ha un tale costrutto nei suoi oggetti di base e non voglio scrivere un intero stack di metodi S4 per riprodurre frame di dati che trasportano le informazioni sull'unità. Nota che comment()non sono commenti nel codice. Allega un attributo specifico all'oggetto che può essere un vettore, un elemento per colonna del frame di dati contenente le informazioni sulle unità. È facile estrarre queste informazioni, quindi non vedo perché implementare qualcosa sarebbe difficile o impossibile?
Ripristina Monica - G. Simpson l'

1
Gavin, sto suggerendo qualcosa di molto più semplice. Ad esempio, se a volte le concentrazioni di selenio sono registrate in mg / L e altre volte come meq / L, è possibile selezionare facilmente tutte le istanze di quest'ultima e moltiplicare la concentrazione per il fattore appropriato per convertirla in mg / L. Tuttavia - questo può essere la fonte della vostra objection-- Rè sicuramente non è il posto giusto per essere il mantenimento di basi di dati e l'esecuzione di processi di questo tipo, anche se è in grado di farlo. È meglio integrato da un buon sistema di gestione del database per tale lavoro.
whuber

4
Amen per questo! comment()et al sono utili per note e informazioni ad hoc, ma è necessario un sistema adeguato per la gestione dei dati su larga scala. È interessante notare che ora dobbiamo occuparci di questo all'interno del gruppo di ricerca e della consulenza per cui lavoro in merito ai nostri dati di chimica e che abbiamo bisogno di inserirli in un database adeguato.
Ripristina Monica - G. Simpson,

8

Funzionalità simili esistono in altri pacchetti, come il comando -notes- in Stata . Usiamo questo per documentare i dettagli completi di una variabile, ad esempio i dettagli del dosaggio per una misurazione biochimica o la formulazione esatta della domanda per i dati del questionario. Spesso si tratta di troppe informazioni per il nome o l'etichetta della variabile, uno o entrambi i quali vengono visualizzati nell'output di ogni analisi che coinvolge la variabile e pertanto devono essere mantenuti ragionevolmente brevi.


4

Una delle cose che mi ritrovo a fare molto è tenere traccia dei comandi utilizzati per generare dati e oggetti e ho trovato il commento uno strumento utile per questo.

'Matched.call.data' e 'generate.command.string' fanno il trucco. Non perfetto, ma utile e utile per "comment ()". :)

# Comments only accept strings...
# Substituting the escaped quotes ('\"') makes it prettier.
generate.command.string <- function( matched.call.data )
{
  command.string <- as.character( bquote( .( list( matched.call.data ) ) ) )
  sapply( bquote( .(command.string) ),
                  USE.NAMES=FALSE,
                  function( x )
                    gsub( "\\\"", "\'", as.list( match.call() )$x )[[2]] )
}

# Some generating function...
generate.matrix <- function( nrows, ncols, data=NA ) {
  # Some generated object
  mat <- matrix( data= data, nrow= nrows, ncol= ncols )

  matched.call.data <- do.call( "call",
                                c( list( as.character( match.call()[[1]] ) ),
                                lapply( as.list( match.call() )[-1], eval ) ) )
  comment( mat ) <- c( Generated= date(),
                       Command = generate.command.string( matched.call.data ) )

  mat
}

# Generate an object with a missing argument.
emptyMat <- generate.matrix( nrows=2, ncols=2 )
comment( emptyMat )

# Generate without formally stating arguments.
dataMat <- generate.matrix( 2, 2, sample(1:4, 4, replace= TRUE ) )
comment( dataMat )

# And with a longer command.
charMat <- generate.matrix( 3, 3,
                  c( 'This', 'is', 'a', 'much', 'longer',
                     'argument', 'section', 'that', 'wraps') )
comment( charMat )

# And with a variable.
myData <- c( 'An', 'expanded', 'command', 'argument')
charMat2 <- generate.matrix( 2, 2, myData )
comment( charMat2 )

# Create a new object from an original command.
Sys.sleep(1)
emptyMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )
dataMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )

# Check equality of the static matrices.
identical( emptyMat, emptyMat2 )

# The generation dates are different.
all.equal( emptyMat, emptyMat2, check.attributes= FALSE )
comment( emptyMat )['Generated'] <- NA
comment( emptyMat2 )['Generated'] <- NA
identical( emptyMat, emptyMat2 )

# Command argument structure still works too.
str( as.list( match.call(
  generate.matrix, parse( text=comment( charMat2 )[[ 'Command' ]] ) ) )[-1] )

2

Mi permetta di suggerire la mia soluzione generale alla gestione degli oggetti in R: il repopacchetto. Usandolo, puoi assegnare ad ogni variabile un nome lungo, una descrizione, un set di tag, un URL remoto, relazioni di dipendenza e anche allegare figure o file esterni generici. Ad esempio, il codice sorgente può essere archiviato come elemento repository e collegato alle risorse da esso prodotte. Trova l'ultima versione stabile su CRAN ( install.packages("repo")) o l'ultimo sviluppo su github . Una rapida panoramica qui . Spero che sia d'aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.