¿Cómo nombrar variables sobre la marcha?

96

¿Es posible crear nuevos nombres de variables sobre la marcha?

Me gustaría leer marcos de datos de una lista en nuevas variables con números al final. Algo como orca1, orca2, orca3 ...

Si intento algo como

paste("orca",i,sep="")=list_name[[i]]

Me sale este error

target of assignment expands to non-language object

¿Conoces alguna otra manera de resolver esto?

Maiasaura
fuente
10
Mientras proporcionemos etiquetas r-faq, proporcionemos el enlace (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Respuestas:

118

Utilizar assign:

assign(paste("orca", i, sep = ""), list_name[[i]])
Shane
fuente
28
Así es como se hace. Aquí hay una metapregunta que es: "¿Debería hacer esto?" La respuesta casi siempre es "no". Casi siempre se prefieren los elementos con nombre en una lista.
Ari B. Friedman
26
La respuesta es casi siempre "no", excepto cuando no lo es.
Shane
9
Bueno, por supuesto. Pero la mayoría de las personas que buscan esta respuesta no lo hacen desde la posición de haber rechazado una lista para su solicitud.
Ari B. Friedman
@Ari B. Friedman Genero nombres de variables para conjuntos de datos que guardo en mi paquete / datos. Cada uno en su archivo con el mismo nombre para el archivo y los datos en él (dadas las recomendaciones de R para los datos en el paquete). Cada conjunto de datos es de aproximadamente 10 millones y el total es ~ 17 Go. Apenas veo otra forma.
cmbarbu
3
¿Hay alguna razón por la que no usaste paste0?
BroVic
33

Me parece que puede ser mejor con una lista en lugar de utilizar orca1, orca2etc, ... entonces sería orca[1], orca[2], ...

Por lo general, está haciendo una lista de variables diferenciadas solo por un número porque ese número sería una forma conveniente de acceder a ellas más adelante.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

De lo contrario, assignes justo lo que quieres.

Juan
fuente
11
Estoy de acuerdo. Por lo general, cuando las personas piensan que quieren nombrar variables sobre la marcha, lo que realmente quieren es una estructura de datos diferente.
Michael Dunn
9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) discute esto muy bien
Ben Bolker
11

No hagas marcos de datos. Conserve la lista, nombre sus elementos pero no la adjunte.

La principal razón de esto es que si crea variables sobre la marcha, casi siempre tendrá que iterar a través de cada una de ellas para realizar algo útil. Allí, nuevamente se verá obligado a iterar a través de cada uno de los nombres que ha creado sobre la marcha.

Es mucho más fácil nombrar los elementos de la lista e iterar a través de los nombres.

En lo que respecta a adjuntar, es una práctica de programación realmente mala en R y puede ocasionar muchos problemas si no se tiene cuidado.

Sidquanto
fuente
Entonces, ¿hacer un adjunto, pero solo después de haber hecho la iteración a través de la lista?
Mox
4

FAQ dice:

Si usted tiene

varname <- c("a", "b", "d")

tu puedes hacer

get(varname[1]) + 2

para

a + 2

o

assign(varname[1], 2 + 2)

para

a <- 2 + 2

Entonces, parece que usa GET cuando desea evaluar una fórmula que usa una variable (como una concatenación) y ASSIGN cuando desea asignar un valor a una variable declarada previamente.

Sintaxis para asignar: asignar (x, valor)

X: un nombre de variable, dado como una cadena de caracteres. No se realiza ninguna coerción y se utilizará el primer elemento de un vector de caracteres de longitud mayor que uno, con una advertencia.

valor: valor que se asignará ax.

Mox
fuente
0

Otra solución complicada es nombrar elementos de la lista y attach:

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
Marek
fuente
14
complicado, pero no sabio. si la respuesta es attachque normalmente estás haciendo la pregunta incorrecta ...
Ben Bolker
-1

¿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 puso, falta la primera línea y luego le da el mensaje de error.

gla
fuente
3
Esto no aborda la pregunta de OP. Tenemos una lista con marcos de datos y queremos asignarla a marcos de datos, denominados orca1, orca2, etc.
zx8754
"Lista con marcos de datos" = "lista de marcos de datos"?
Mox