¿Cuál es un buen uso de la función 'comentario' en R?

35

Acabo de descubrir la commentfunción en R. Ejemplo:

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

Esta es la primera vez que llegué a esta función y me preguntaba cuáles son sus usos comunes / útiles. Dado que es bastante difícil buscar "comentarios R" en Google y encontrar resultados relevantes, esperaba que alguien aquí pudiera compartir su experiencia.

Tal Galili
fuente
3
No creo que esta pregunta realmente necesite ser una CW. Está en el límite, pero no está tan mal.
csgillespie
gran informacion! (la serie de paquetes de tiempo '' XTS tiene esta funcionalidad similares metadatos.)
Doug
2
Esta pregunta ha sido sugerida para el cierre: si la pregunta se interpreta en términos generales (y tenga en cuenta que prácticamente ninguna de las respuestas es específica de R), esta es realmente una pregunta sobre cuándo y por qué uno querría etiquetar columnas de datos. Este tipo de problema de gestión de datos es claramente una parte regular de la práctica estadística, por lo que posiblemente se trate de un tema aquí.
Silverfish

Respuestas:

15

Para segundo @Gavin, Frank Harrell ha desarrollado formas eficientes de manejar data.frame anotado en R en su paquete Hmisc . Por ejemplo, las funciones label()y units()permiten agregar atributos dedicados a los objetos R. Los encuentro muy útiles cuando produzco un resumen de data.frame (por ejemplo, con describe()).

Otra forma útil de utilizar dicho atributo adicional es aplicar una marca de tiempo en un conjunto de datos. También agrego un atributo para cosas como semilla aleatoria, número de pliegue (cuando uso k-kold o LOO validación cruzada).

chl
fuente
14

Una cosa que a menudo me encuentro haciendo en mis scripts R para una tarea particular de análisis de datos es incluir comentarios en el script sobre las unidades de variables en mis marcos de datos. Trabajo con datos ambientales y los químicos y ecologistas parecen disfrutar usando una amplia gama de unidades diferentes para las mismas cosas (mg L - 1 vs mu eq L - 1 , etc.). Mis colegas generalmente almacenan esta información en la fila inmediatamente debajo de los nombres de las columnas en las hojas de Excel.-1-1

Vería comment()como una buena manera de adjuntar esta información a un marco de datos para referencia futura.

Restablece a Mónica - G. Simpson
fuente
2
La solución estándar es incluir un campo para las unidades de medida, de modo que la computadora pueda ser programada para convertir todos los resultados numéricos en unidades comunes (específicas de parámetros). Enterrar esta información crucial en los comentarios hace que implementar esta capacidad sea difícil o imposible.
whuber
2
@whuber pero R no tiene esa construcción en sus objetos base y no quiero escribir una pila completa de métodos S4 para reproducir marcos de datos que transporten la información de la unidad. Tenga en cuenta que comment()no hay comentarios en el código. Adjunta un atributo específico al objeto que puede ser un vector, un elemento por columna del marco de datos que contiene la información de las unidades. Es fácil extraer esta información, así que no veo por qué implementar algo sería difícil o imposible.
Restablecer Monica - G. Simpson
1
Gavin, sugiero algo mucho más simple. Por ejemplo, si a veces las concentraciones de selenio se registran en mg / L y otras veces como meq / L, puede seleccionar fácilmente todas las instancias de este último y multiplicar la concentración por el factor apropiado para convertirlo a mg / L. Sin embargo, esta puede ser la fuente de su objeción, Rdefinitivamente no es el lugar adecuado para mantener bases de datos y realizar procesos de este tipo, aunque sea capaz de hacerlo. Se complementa mejor con un buen sistema de gestión de bases de datos para dicho trabajo.
whuber
44
¡Amen a eso! comment()et al son útiles para notas e información ad hoc, pero se requiere un sistema adecuado para el manejo de datos a mayor escala. Curiosamente, tenemos que abordar esto ahora dentro del grupo de investigación y consultoría para el que trabajo con respecto a nuestros datos químicos y necesitamos ingresarlos en una base de datos adecuada.
Vuelve a instalar a Monica - G. Simpson el
8

Existen instalaciones similares en otros paquetes, como el comando -notes- en Stata . Usamos esto para documentar los detalles completos de una variable, por ejemplo, detalles del ensayo para una medición bioquímica, o la redacción exacta de la pregunta solicitada para los datos del cuestionario. Esto suele ser demasiada información para el nombre o la etiqueta de la variable, uno o ambos se muestran en el resultado de cada análisis que involucra la variable y, por lo tanto, es mejor mantenerlos razonablemente cortos.

una parada
fuente
4

Una de las cosas que me encuentro haciendo mucho es rastrear los comandos utilizados para generar datos y objetos, y he encontrado que el comentario es una herramienta útil para esto.

El 'matched.call.data' y 'generate.command.string' hacen el truco. No es perfecto, pero útil y un uso para '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] )
Todos
fuente
2

Permítanme sugerir mi solución general para la gestión de objetos en R: el repopaquete. Al usarlo, puede asignar a cada variable un nombre largo, una descripción, un conjunto de etiquetas, una URL remota, relaciones de dependencia y también adjuntar figuras o archivos externos genéricos. Por ejemplo, el código fuente puede almacenarse como un elemento de repositorio y adjuntarse a los recursos producidos por él. Encuentre la última versión estable en CRAN ( install.packages("repo")) o el último desarrollo en github . Una descripción rápida aquí . Espero eso ayude.

Francesco Napolitano
fuente