Vous ne pouvez pas faire ce genre de sous-ensembles avec $
. Dans le code source ( R/src/main/subset.c
), il indique:
/ * L'opérateur $ subset.
Nous devons nous assurer de n'évaluer que le premier argument.
Le second sera un symbole qui doit être mis en correspondance et non évalué.
* /
Deuxième argument? Quoi?! Vous devez comprendre que $
, comme tout le reste dans R, (y compris par exemple (
, +
, ^
etc.) est une fonction, qui prend des arguments et est évaluée. df$V1
pourrait être réécrit comme
`$`(df , V1)
ou bien
`$`(df , "V1")
Mais...
`$`(df , paste0("V1") )
... par exemple, ne fonctionnera jamais, ni rien d'autre qui doit d'abord être évalué dans le deuxième argument. Vous ne pouvez passer qu'une chaîne qui n'est jamais évaluée.
Utilisez plutôt [
(ou [[
si vous souhaitez extraire une seule colonne en tant que vecteur).
Par exemple,
var <- "mpg"
#Doesn't work
mtcars$var
#These both work, but note that what they return is different
# the first is a vector, the second is a data.frame
mtcars[[var]]
mtcars[var]
Vous pouvez effectuer le tri sans boucles, en utilisant do.call
pour construire l'appel à order
. Voici un exemple reproductible ci-dessous:
# set seed for reproducibility
set.seed(123)
df <- data.frame( col1 = sample(5,10,repl=T) , col2 = sample(5,10,repl=T) , col3 = sample(5,10,repl=T) )
# We want to sort by 'col3' then by 'col1'
sort_list <- c("col3","col1")
# Use 'do.call' to call order. Seccond argument in do.call is a list of arguments
# to pass to the first argument, in this case 'order'.
# Since a data.frame is really a list, we just subset the data.frame
# according to the columns we want to sort in, in that order
df[ do.call( order , df[ , match( sort_list , names(df) ) ] ) , ]
col1 col2 col3
10 3 5 1
9 3 2 2
7 3 2 3
8 5 1 3
6 1 5 4
3 3 4 4
2 4 3 4
5 5 1 4
1 2 5 5
4 5 3 5
Si je comprends bien, vous avez un vecteur contenant des noms de variables et souhaitez parcourir chaque nom et trier votre bloc de données par eux. Si tel est le cas, cet exemple doit illustrer une solution pour vous. Le principal problème dans le vôtre (l'exemple complet n'est pas complet, donc je ne suis pas sûr de ce que vous pourriez manquer d'autre) est qu'il devrait l'être à la
order(Q1_R1000[,parameter[X]])
placeorder(Q1_R1000$parameter[X])
, car le paramètre est un objet externe qui contient un nom de variable opposé à une colonne directe de votre base de données (qui, lorsque le$
serait approprié).la source
L'utilisation de dplyr fournit une syntaxe simple pour trier les trames de données
Il peut être utile d'utiliser la version NSE comme indiqué ici pour permettre la construction dynamique de la liste de tri
la source
Une autre solution consiste à utiliser #get:
la source
Eu un problème similaire en raison de certains fichiers CSV qui avaient différents noms pour la même colonne.
C'était la solution:
J'ai écrit une fonction pour renvoyer le premier nom de colonne valide dans une liste, puis je l'ai utilisé ...
la source
si vous voulez sélectionner une colonne avec un nom spécifique, faites simplement
vous pouvez l'exécuter en boucle ainsi que de manière inversée pour ajouter un nom dynamique, par exemple si A est une trame de données et xyz est une colonne à nommer comme x, alors j'aime ça
encore une fois, cela peut également être ajouté en boucle
la source
la source
trop tard ... mais je suppose que j'ai la réponse -
Voici mon exemple de dataframe study.df -
Puis -
la source