es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo llenar múltiples arreglos en R con un solo bucle

Tengo muchas matrices para llenar en R, cada una de las cuales tiene un nombre diferente en un patrón específico. El problema que tengo es que no puedo encontrar la manera de referirme a los nombres de las matrices como variables, para poder hacer referencia a ellas de manera sistemática dentro de un bucle. Por ejemplo, se crean utilizando este bucle.

for (i in c(40,45,50,55,57,60,65)){
  assign(paste0('hdd_',as.character(i),'_365_z'), rep(NA,365))}

Quiero llenar cada una de estas matrices, que tienen nombres como hdd40365z, hdd45365z, etc.

Digamos que quiero llenar cada una de estas matrices usando una función simple como esta:

my_func <- function(value,doy){
  return(value * doy/2)}  # doy = doy or 1:365

Puedo escribir un bucle para hacer esto:

for (j in c(40,45,50,55,57,60,65)){
    for (k in 1:365){
        # intentar llenar las matrices un día a la vez
        paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)}}

Obviamente, esto no funciona. He intentado usar lo siguiente para hacer esto, pero no está funcionando. Debe haber una manera de poder hacer algo así, creo, pero no puedo encontrar la combinación de eval, parse, as.name, o algo más para hacerlo. Cualquier ayuda sería genial. Gracias.

eval(parse(text = paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)))
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para referirse a los nombres de los arreglos como variables dentro del bucle es usar la función get, la cual permite acceder a los objetos de R por su nombre como cadenas de texto. Aquí tienes un ejemplo de cómo modificar el bucle:

    for (j in c(40, 45, 50, 55, 57, 60, 65)) {
      arr_name <- paste0('hdd_', as.character(j), '_365_z')
      arr <- get(arr_name)  # acceder al arreglo por su nombre
      for (k in 1:365) {
        arr[k] <- my_func(j, k)
      }
      assign(arr_name, arr)  # asignar el arreglo actualizado de vuelta a su nombre
    }
    

    En este bucle modificado, primero creamos una variable de tipo cadena arr_name que representa el nombre del arreglo dentro del bucle. Luego utilizamos la función get para acceder al arreglo por su nombre y asignarlo a la variable arr. Dentro del bucle anidado, podemos manipular la variable arr como si fuera el arreglo real, utilizando la notación de índice [k]. Finalmente, utilizamos la función assign para guardar el arreglo actualizado de vuelta a su nombre original.

    Ten en cuenta que generalmente no se recomienda crear un gran número de variables separadas con nombres similares en R. A menudo es mejor utilizar una estructura de datos como una lista o un arreglo para almacenar los datos y acceder a ellos utilizando indexación u otros métodos. Sin embargo, si necesitas trabajar con nombres de variables de manera dinámica en R, las funciones get y assign pueden ser herramientas útiles.

Comments are closed.