Sélectionner de façon dynamique trame de données de colonnes à l'aide de $ et un vecteur de noms de colonne
Je souhaite commander un bloc de données basée sur les différentes colonnes, l'une au détour d'un virage. J'ai un caractère de vecteur avec les noms de colonnes sur lesquelles la order
devrait être fondée:
parameter <- c("market_value_LOCAL", "ep", "book_price", "sales_price", "dividend_yield",
"beta", "TOTAL_RATING_SCORE", "ENVIRONMENT", "SOCIAL", "GOVERNANCE")
Je souhaite faire une boucle sur les noms dans parameter
et dynamique, sélectionnez la colonne à utiliser pour order
mes données:
Q1_R1000_parameter <- Q1_R1000[order(Q1_R1000$parameter[X]), ]
où X
est 1:10
(parce que j'ai 10 éléments dans parameter
).
De faire mon exemple reproductible, considérer l'ensemble de données mtcars
et certains noms de variables stockées dans un caractère de vecteur de cols
. Lorsque j'essaie de sélectionner une variable à partir d' mtcars
à l'aide d'une dynamique sous-ensemble de cols
de la même manière que ci-dessus (Q1_R1000$parameter[X]
), la colonne n'est pas sélectionnée:
cols <- c("cyl", "am")
mtcars$cols[1]
# NULL
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire ce genre de subsetting avec
$
. Dans le code source (R/src/main/subset.c
), il est indiqué:Deuxième argument? Quoi?! Vous devez comprendre que
$
, comme tout le reste dans R, (y compris, par exemple(
,+
,^
etc) est une fonction qui prend en arguments et est évaluée.df$V1
pourrait être réécrit commeou en effet
Mais...
...par exemple ne fonctionnera jamais, ni rien d'autre qui doit d'abord être évalué dans le deuxième argument. Vous ne pouvez passer une chaîne de caractères qui est jamais évalué.
Au lieu d'utiliser
[
(ou[[
si vous voulez extraire une seule colonne comme un vecteur).Par exemple,
Vous pouvez exécuter la commande sans boucles, à l'aide de
do.call
pour construire l'appel àorder
. Voici un exemple reproductible ci-dessous:À l'aide de dplyr fournit une syntaxe facile à utiliser pour le tri des trames de données
Il pourrait être utile d'utiliser la NSE version comme illustré ici pour permettre l'élaboration dynamique de la trier la liste de
Si je comprends bien, vous avez un vecteur contenant les noms de variables et voudrais en boucle sur chaque nom et le tri de vos données d'image par eux. Si oui, cet exemple devrait illustrer une solution pour vous. Le principal problème dans la vôtre (l'exemple complet n'est pas complète si je ne suis pas sûr de ce que vous pourriez manquer), c'est qu'il doit être
order(Q1_R1000[,parameter[X]])
au lieu deorder(Q1_R1000$parameter[X])
, puisque paramètre est un objet externe qui contient un nom de variable opposition à une colonne de votre bloc de données (qui, quand la$
serait approprié).Eu le même problème en raison de certains fichiers CSV qui avaient des noms différents pour la même colonne.
C'était la solution:
J'ai écrit une fonction pour renvoyer le premier qui valide le nom de colonne dans une liste, puis utilisé que...
si vous voulez sélectionner une colonne avec le nom spécifique, puis il suffit de faire
vous pouvez l'exécuter en boucle
inverse façon d'ajouter de la dynamique de nom par exemple, si Un est sur le bloc de données et xyz est la colonne pour être nommé comme x, puis-je faire comme ceci
là encore, cela peut aussi être ajouté dans la boucle
Une autre solution est d'utiliser #get:
trop tard.. mais je suppose que j'ai la réponse -
Voici mon échantillon d'étude.df dataframe -
Puis -