Vous ne pouvez pas faire ce genre de sous-ensemble avec $
. Dans le code source ( R/src/main/subset.c
), il est indiqué :
/*L'opérateur de sous-ensemble $.
Nous devons être sûrs 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 réaliser que $
comme tout le reste de R, (y compris par exemple (
, +
, ^
etc.) est une fonction, qui prend des arguments et est évaluée. df$V1
pourrait être réécrit comme suit
`$`(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 second argument. Vous ne pouvez passer qu'une chaîne de caractères qui est jamais évalué.
Utilisez plutôt [
(ou [[
si vous voulez extraire une seule colonne sous forme de 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 l'ordonnancement 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