No puedes hacer ese tipo de subconjunto con $
. En el código fuente ( R/src/main/subset.c
) dice:
/ * El operador $ subset.
Necesitamos asegurarnos de evaluar solo el primer argumento.
El segundo será un símbolo que debe coincidir, no evaluar.
* /
¿Segundo argumento? ¡¿Qué?! Tienes que darte cuenta de que$
, como todo lo demás en R, (incluyendo, por ejemplo (
, +
, ^
etc) es una función que toma argumentos y se evalúa. df$V1
podría reescribirse como
`$`(df , V1)
o de hecho
`$`(df , "V1")
Pero...
`$`(df , paste0("V1") )
... por ejemplo, nunca funcionará, ni ninguna otra cosa que deba evaluarse primero en el segundo argumento. Solo puede pasar una cuerda que nunca evalúa.
En su lugar use [
(o [[
si desea extraer solo una columna como vector).
Por ejemplo,
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]
Puede realizar el pedido sin bucles, utilizando do.call
para construir la llamada a order
. A continuación, se muestra un ejemplo reproducible:
# 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 lo entiendo correctamente, tiene un vector que contiene nombres de variables y le gustaría recorrer cada nombre y ordenar su marco de datos por ellos. Si es así, este ejemplo debería ilustrarle una solución. El problema principal en el suyo (el ejemplo completo no está completo, así que no estoy seguro de qué más puede faltar) es que debería ser en
order(Q1_R1000[,parameter[X]])
lugar deorder(Q1_R1000$parameter[X])
, ya que el parámetro es un objeto externo que contiene un nombre de variable opuesto a una columna directa de su marco de datos (que cuando$
sería apropiado).fuente
El uso de dplyr proporciona una sintaxis sencilla para ordenar los marcos de datos
Puede resultar útil utilizar la versión NSE como se muestra aquí para permitir la creación dinámica de la lista de clasificación
fuente
Otra solución es usar #get:
fuente
Tuve un problema similar debido a algunos archivos CSV que tenían varios nombres para la misma columna.
Esta fue la solución:
Escribí una función para devolver el primer nombre de columna válido en una lista, luego usé eso ...
fuente
si desea seleccionar una columna con un nombre específico, simplemente haga
puede ejecutarlo en bucle y también en forma inversa para agregar un nombre dinámico, por ejemplo, si A es un marco de datos y xyz es una columna que se llamará x, entonces me gusta esto
de nuevo, esto también se puede agregar en bucle
fuente
fuente
demasiado tarde ... pero supongo que tengo la respuesta -
Aquí está mi marco de datos de ejemplo de study.df:
Y entonces -
fuente