¿Utilizas attach () o llamas a variables por nombre o segmentación?


Muchos libros y guías de introducción comienzan con la práctica de adjuntar un data.frame para que pueda llamar a las variables por su nombre. Siempre me ha parecido favorable llamar a variables con notación $ o corte entre corchetes [,2]. De esta manera puedo usar múltiples data.frames sin confundirlos y/o usar iteración para llamar sucesivamente a columnas de interés. Noté que Google publicó recientemente pautas de codificación para R que incluían la línea

1) adjuntar: evite usarlo

¿Cómo se sienten las personas acerca de esta práctica?

Author: Richard Erickson, 2009-08-21

7 answers

Nunca uso adjuntar. with y within son tus amigos.

Código de ejemplo:

> N <- 3
> df <- data.frame(x1=rnorm(N),x2=runif(N))
> df$y <- with(df,{
   x1+x2
 })
> df
          x1         x2          y
1 -0.8943125 0.24298534 -0.6513271
2 -0.9384312 0.01460008 -0.9238312
3 -0.7159518 0.34618060 -0.3697712
> 
> df <- within(df,{
   x1.sq <- x1^2
   x2.sq <- x2^2
   y <- x1.sq+x2.sq
   x1 <- x2 <- NULL
 })
> df
          y        x2.sq     x1.sq
1 0.8588367 0.0590418774 0.7997948
2 0.8808663 0.0002131623 0.8806532
3 0.6324280 0.1198410071 0.5125870

Editar: las menciones de hadley se transforman en los comentarios. aquí hay un código:

 > transform(df, xtot=x1.sq+x2.sq, y=NULL)
       x2.sq       x1.sq       xtot
1 0.41557079 0.021393571 0.43696436
2 0.57716487 0.266325959 0.84349083
3 0.04935442 0.004226069 0.05358049
 25
Author: Eduardo Leoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-02 16:15:36

Prefiero usar with para obtener el equivalente de attach en un solo comando:

 with(someDataFrame,  someFunction(...))

Esto también conduce naturalmente a una forma donde subset es el primer argumento:

 with(subset(someDataFrame,  someVar > someValue),
      someFunction(...))

Lo que deja bastante claro que operamos en una selección de los datos. Y mientras que muchas funciones de modelado tienen argumentos data y subset, el uso anterior es más consistente, ya que también se aplica a aquellas funciones que no tienen argumentos data y subset.

 13
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-21 12:17:47

El principal problema con attach es que puede resultar en un comportamiento no deseado. Supongamos que tiene un objeto con el nombre xyz en su espacio de trabajo. Ahora adjunte dataframe abc que tiene una columna llamada xyz. Si su referencia de código a xyz, ¿puede garantizar que son referencias al objeto o a la columna dataframe? Si no utiliza attach, entonces es fácil. solo xyz se refiere al objeto. abc abc xyz se refiere a la columna del dataframe.

Una de las principales razones que adjuntar se utiliza con frecuencia en libros de texto es que acorta el código.

 8
Author: Thierry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-24 08:26:38

"Adjuntar" es una tentación malvada. El único lugar donde funciona bien es en la configuración de aula donde se le da un único dataframe y se espera que escriba líneas de código para hacer el análisis en ese dataframe. Es poco probable que el usuario vuelva a utilizar esos datos una vez que se haya realizado y entregado la asignación.

Sin embargo, en el mundo real, se pueden agregar más marcos de datos a la recopilación de datos en un proyecto en particular. Además, a menudo se copian y pegan bloques de código para ser utilizado para algo similar. A menudo uno toma prestado de algo que hizo hace unos meses y no puede recordar los matices de cómo se llamaba desde dónde. En estas circunstancias uno se ahoga por el uso anterior de " adjuntar."

 7
Author: Farrel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 15:58:17

Como dijo Leoni, with y within son sustitutos perfectos de attach, pero no lo descartaría completamente. Lo uso a veces, cuando estoy trabajando directamente en el indicador R y quiero probar algunos comandos antes de escribirlos en un script. Especialmente cuando se prueban varios comandos, attach puede ser una alternativa más interesante, conveniente e incluso inofensiva a with y within, ya que después de ejecutar attach, el símbolo del sistema está claro para que pueda escribir entradas y ver salidas.

Acaba de hacer asegúrese de detach sus datos después de que haya terminado!

 3
Author: Waldir Leoncio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-15 16:15:37

Prefiero no usar attach(), ya que es demasiado fácil ejecutar un lote de código varias veces cada vez que se llama attach(). El marco de datos se agrega a la ruta de búsqueda cada vez, extendiéndolo innecesariamente. Por supuesto, una buena práctica de programación es también detach() al final del bloque de código, pero eso a menudo se olvida.

En su lugar, uso xxx xxx y o xxx [, "y"]. Es más transparente.

Otra posibilidad es utilizar el argumento de datos disponible en muchas funciones que permite variables a referenciar dentro del marco de datos. por ejemplo, lm(z ~ y, data=xxx).

 3
Author: Rob Hyndman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-17 02:17:31

Aunque yo también prefiero no usar attach(), tiene su lugar cuando necesita persistir un objeto (en este caso, un data.frame) durante la vida de su programa cuando tiene varias funciones que lo usan. En lugar de pasar el objeto a cada función R que lo usa, creo que es más conveniente mantenerlo en un solo lugar y llamar a sus elementos según sea necesario.

Dicho esto, solo lo usaría si sé cuánta memoria tengo disponible y solo si me aseguro de que detach() esto data.frame una vez que está fuera de alcance.

¿Tengo sentido?

 2
Author: AlexGilgur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-17 02:16:25