web-dev-qa-db-fra.com

Sous-ensemble basé sur le nom de colonne variable

Je me demande comment utiliser la fonction subset si je ne connais pas le nom de la colonne que je veux tester. Le scénario est le suivant: j'ai une application Shiny où l'utilisateur peut choisir une variable sur laquelle filtrer (sous-ensemble) la table de données. Je reçois le nom de la colonne de la webapp en entrée et je souhaite effectuer un sous-ensemble en fonction de la valeur de cette colonne, comme suit:

subset(myData, THECOLUMN == someValue)

Sauf lorsque THECOLUMN et someValue sont des variables. Existe-t-il une syntaxe pour transmettre le nom de colonne souhaité sous forme de chaîne?

Semble vouloir un bareword qui est le nom de la colonne, pas une variable qui contient le nom de la colonne.

25
adv12

C'est précisément pourquoi subset est un mauvais outil pour autre chose qu'une utilisation interactive:

d <- data.frame(x = letters[1:5],y = runif(5))
> d[d[,'x'] == 'c',]
  x         y
3 c 0.3080524

Fondamentalement, l'extraction de choses dans R est construite autour de [. Utilise le.

22
joran

subset et with sont conçus pour une utilisation interactive et des avertissements contre leur utilisation dans d'autres fonctions se trouvent dans leurs pages d'aide. Cela découle de leur stratégie d'arguments d'évaluation en tant qu'expressions dans un environnement construit à partir des noms de leurs arguments de données. Sinon, ces noms de colonne/élément ne seraient pas des "objets" au sens R.

Si THECOLUMN est le nom d'un objet dont la valeur est le nom de la colonne et someValue est le nom d'un objet dont la valeur est la cible, alors vous devez utiliser:

dfrm[ dfrm[[THECOLUMN]] == someValue , ]

Le fait que "[[" évalue son argument est pourquoi il est supérieur à "$" pour la programmation. Si nous utilisons l'exemple de joran:

 d <- data.frame(x = letters[1:5],y = runif(5))
 THECOLUMN= "x"
 someValue= "c"

d[ d[[THECOLUMN]] == someValue , ]
#   x         y
# 3 c 0.7556127

Donc dans ce cas, tous ceux-ci renvoient le même vecteur atomique:

d[[ THECOLUMN ]]
d[[ 'x' ]]
d[ , 'x' ]
d[, THECOLUMN ]
d$x  # of the three extraction functions: `$`, `[[`, and `[`,
     # only `$` is unable to evaluate its argument
25
42-

Je pense que vous pourriez utiliser le one-liner suivant:

myData[ , grep(someValue, colnames(myData))]

colnames(myData)

génère un vecteur contenant tous les noms de colonnes et

grep(someValue, colnames(myData))

devrait entraîner un vecteur numérique de longueur 1 (étant donné que le nom de la colonne est unique) pointant vers votre colonne. Voir ?grep pour plus d'informations sur la correspondance de motifs dans R.

4
mcmunder