Home > Mobile >  How to fill multiple arrays in R with one loop
How to fill multiple arrays in R with one loop

Time:12-23

I have many arrays to fill in R, each of which has a different name in a specific pattern. The problem I'm having is that I can't figure out how to refer to the array names as variables, so I can refer to them in a systematic way inside a loop. They are created using this loop, for example.

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

I want to fill each of these arrays, which are now named like this: hdd_40_365_z, hdd_45_365_z, etc.

Let's say I want to fill each of these arrays using a simple function like this:

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

I can write a loop to do this:

for (j in c(40,45,50,55,57,60,65)){
    for (k in 1:365){
        # try to fill arrays one day at a time
        paste0('hdd_',as.character(j),'_365_z')[k] <- my_func(j,k)}}

Obviously, this doesn't work. I've tried using the following to do this, but it's not working. There has to be a way to be able to do something like this, I would think, but I can't figure out the combination of eval, parse, as.name, or something else to do it. Any help would be great. Thank you.

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

CodePudding user response:

You were close, especially since you already know assign. Besides assign, the trick is to get the vector and concatenate the result of my_func to the existing vector.

We initialize the objects using NULL instead of NA,

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

and c each result.

for (j in c(40, 45, 50, 55, 57, 60, 65)) {
  for (k in 1:365) {
    # try to fill arrays one day at a time
    x <- paste0('hdd_', as.character(j), '_365_z')
    assign(x, c(get(x), my_func(j, k)))
  }
}

Gives:

lapply(mget(ls(pattern='hdd')), head)
# $hdd_40_365_z
# [1]  20  40  60  80 100 120
# 
# $hdd_45_365_z
# [1]  22.5  45.0  67.5  90.0 112.5 135.0
# 
# $hdd_50_365_z
# [1]  25  50  75 100 125 150
# 
# $hdd_55_365_z
# [1]  27.5  55.0  82.5 110.0 137.5 165.0
# 
# $hdd_57_365_z
# [1]  28.5  57.0  85.5 114.0 142.5 171.0
# 
# $hdd_60_365_z
# [1]  30  60  90 120 150 180
# 
# $hdd_65_365_z
# [1]  32.5  65.0  97.5 130.0 162.5 195.0
  • Related