Cómo nombrar las variables sobre la marcha?
Pregunta
¿Es posible crear nuevos nombres de variables sobre la marcha?
Me gustaría leer tramas de datos a partir de una lista en nuevas variables con números al final. Algo así como orca1, orca2, orca3 ...
Si intento algo así como
paste("orca",i,sep="")=list_name[[i]]
Me sale este error
target of assignment expands to non-language object
¿Hay alguna otra forma de evitar esto?
Solución
Uso assign
:
assign(paste("orca", i, sep = ""), list_name[[i]])
Otros consejos
Me parece que podría ser mejor con una lista en lugar de utilizar orca1
, orca2
, etc, ... entonces sería orca[1]
, orca[2]
, ...
Por lo general, usted está haciendo una lista de las variables que se diferencian por nada más que un número, porque ese número sería una manera conveniente de acceder a ellos más tarde.
orca <- list()
orca[1] <- "Hi"
orca[2] <- 59
De lo contrario, assign
es justo lo que quieres.
No haga que las tramas de datos. Mantenga la lista, el nombre de sus elementos, pero no conecte a él.
La principal razón para esto es que si haces las variables sobre la marcha, casi siempre va a tener más adelante para iterar a través de cada uno de ellos para llevar a cabo algo útil. Allí nuevamente se verá obligado a iterar a través de cada uno de los nombres que se han creado sobre la marcha.
Es mucho más fácil para nombrar los elementos de la lista y repetir por los nombres.
En lo que se refiere adjuntar, su práctica de programación muy mal en I y puede conducir a una gran cantidad de problemas si no se tiene cuidado.
Si usted tiene
varname <- c("a", "b", "d")
que puede hacer
get(varname[1]) + 2
para
a + 2
o
assign(varname[1], 2 + 2)
para
a <- 2 + 2
Así que parece que se utiliza GET cuando se desea evaluar una fórmula que utiliza una variable (como una concatenación), y asignar cuando se quiere asignar un valor a una variable previamente declarado.
Sintaxis para asignar: Asignar (x, valor)
x: un nombre de variable, dado como una cadena de caracteres. No se realiza la coacción, y el primer elemento de un vector de caracteres de longitud mayor que uno se utilizará, con una advertencia.
valor:. valor que se asigna a x
Otra solución complicado es nombrar elementos de lista y attach
que:
list_name = list(
head(iris),
head(swiss),
head(airquality)
)
names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)
orca1
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
Y esta opción?
list_name<-list()
for(i in 1:100){
paste("orca",i,sep="")->list_name[[i]]
}
Funciona perfectamente. En el ejemplo que pones, primera línea de falta, y luego le da el mensaje de error.