2010-04-10 16 views
9

Supongamos que tengo una trama de datos con una columna cuyo nombre está almacenado en una variable. El acceso a esta columna utilizando la variable es fácil usando notación de corchetes:Acceso a columnas arbitrarias desde una trama de datos R usando()

df <- data.frame(A = rep(1, 10), B = rep(2, 10)) 
column.name <- 'B' 

df[,column.name] 

Pero no es obvio cómo acceder a una columna arbitraria mediante una llamada a with(). El enfoque ingenuo

with(df, column.name) 

evalúa efectivamente column.name en el entorno de la persona que llama. ¿Cómo puedo retrasar la evaluación lo suficiente como para que with() proporcione los mismos resultados que los corchetes?

Respuesta

17

Puede utilizar get:

with(df, get(column.name)) 
1

Usted usa 'con' para crear un espacio de nombres localizado y temporal dentro del cual evalúa alguna expresión. En su código anterior, no ha pasado una expresión.

Por ejemplo:

data(iris) # this data is in your R installation, just call 'data' and pass it in 

general usted tiene que hacer referencia a los nombres de variables dentro de una trama de datos de esta manera:

tx = tapply(iris$sepal.len, list(iris$species), mean) 

A menos que hagas esto:

attach(iris) 

El problema con el uso de 'adjuntar' es la probabilidad de conflictos de espacio de nombres, por lo que debe recordar llamar 'separar'

Es mucho más limpio para usar 'con':

tx = with(iris, tapply(sepal.len, list(species), mean)) 

Así, la firma de llamada (informalmente) es: con (datos, la función())

+1

Este es un buen resumen de 'with()', pero me gustaría saber cómo forzar el valor de 'column.name' para que se convierta en la expresión deseada. – johnmyleswhite

Cuestiones relacionadas