2010-04-10 7 views
9

Supposons que j'ai une trame de données avec une colonne dont le nom est stocké dans une variable. L'accès à cette colonne en utilisant la variable utilise facilement la notation de support:Accès à des colonnes arbitraires à partir d'une trame de données R en utilisant with()

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

df[,column.name] 

Mais il est pas évident comment accéder à une colonne arbitraire en utilisant un appel à with(). L'approche naïve

with(df, column.name) 

évalue efficacement column.name dans l'environnement de l'appelant. Comment puis-je retarder suffisamment l'évaluation pour que le with() donne les mêmes résultats que les crochets?

Répondre

17

Vous pouvez utiliser get:

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

Vous utilisez 'with' pour créer un espace de noms localisé et temporaire dans lequel vous évaluez une expression. Dans votre code ci-dessus, vous n'avez pas passé une expression.

Par exemple:

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

Ordinairement vous devez vous référer à des noms variables dans une trame de données comme ceci:

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

À moins que vous faites ceci:

attach(iris) 

Le problème en utilisant 'attach' est la probabilité de conflits d'espace de noms, vous devez donc vous rappeler d'appeler 'detach'

Il est beaucoup plus propre à utiliser 'avec':

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

Ainsi, la signature d'appel (officieusement) est: avec (données, fonction())

+1

C'est un bon résumé de 'with()', mais j'aimerais savoir comment forcer la valeur de 'column.name' pour qu'elle devienne l'expression désirée. – johnmyleswhite

Questions connexes