For loops storing issue

Viewed 68

How do i store the following loop result in a single vector, keeping it's order? Obs.: print() is there only for reprex purposes.

I've tried with sapply() but it reordered the results.

meses = c("jan", "fev", "mar", "abr", "mai", "jun",
          "jul", "ago", "set", "out", "nov", "dez", "total")

colunas = c("orcado", "realizado", "desvio", "desvio%")

nomes = NULL

for (x in meses) {
  print(paste(colunas, x, sep = "_"))
}
#> [1] "orcado_jan"    "realizado_jan" "desvio_jan"    "desvio%_jan"  
#> [1] "orcado_fev"    "realizado_fev" "desvio_fev"    "desvio%_fev"  
#> [1] "orcado_mar"    "realizado_mar" "desvio_mar"    "desvio%_mar"  
#> [1] "orcado_abr"    "realizado_abr" "desvio_abr"    "desvio%_abr"  
#> [1] "orcado_mai"    "realizado_mai" "desvio_mai"    "desvio%_mai"  
#> [1] "orcado_jun"    "realizado_jun" "desvio_jun"    "desvio%_jun"  
#> [1] "orcado_jul"    "realizado_jul" "desvio_jul"    "desvio%_jul"  
#> [1] "orcado_ago"    "realizado_ago" "desvio_ago"    "desvio%_ago"  
#> [1] "orcado_set"    "realizado_set" "desvio_set"    "desvio%_set"  
#> [1] "orcado_out"    "realizado_out" "desvio_out"    "desvio%_out"  
#> [1] "orcado_nov"    "realizado_nov" "desvio_nov"    "desvio%_nov"  
#> [1] "orcado_dez"    "realizado_dez" "desvio_dez"    "desvio%_dez"  
#> [1] "orcado_total"    "realizado_total" "desvio_total"    "desvio%_total"

Created on 2020-07-17 by the reprex package (v0.3.0)

4 Answers

Good question with a lot of possible answers. :-)

E.g. instead of for loop you can use lapply() and unlist() that into a simple vector:

unlist(lapply(meses, function(x) paste(colunas, x, sep = "_")))
#>  [1] "orcado_jan"      "realizado_jan"   "desvio_jan"      "desvio%_jan"    
#>  [5] "orcado_fev"      "realizado_fev"   "desvio_fev"      "desvio%_fev"    
#>  [9] "orcado_mar"      "realizado_mar"   "desvio_mar"      "desvio%_mar"    
#> [13] "orcado_abr"      "realizado_abr"   "desvio_abr"      "desvio%_abr"    
#> [17] "orcado_mai"      "realizado_mai"   "desvio_mai"      "desvio%_mai"    
#> [21] "orcado_jun"      "realizado_jun"   "desvio_jun"      "desvio%_jun"    
#> [25] "orcado_jul"      "realizado_jul"   "desvio_jul"      "desvio%_jul"    
#> [29] "orcado_ago"      "realizado_ago"   "desvio_ago"      "desvio%_ago"    
#> [33] "orcado_set"      "realizado_set"   "desvio_set"      "desvio%_set"    
#> [37] "orcado_out"      "realizado_out"   "desvio_out"      "desvio%_out"    
#> [41] "orcado_nov"      "realizado_nov"   "desvio_nov"      "desvio%_nov"    
#> [45] "orcado_dez"      "realizado_dez"   "desvio_dez"      "desvio%_dez"    
#> [49] "orcado_total"    "realizado_total" "desvio_total"    "desvio%_total"

Created on 2020-07-17 by the reprex package (v0.3.0)

Using sapply as to avoid copying the vector multiple times:

meses = c("jan", "fev", "mar", "abr", "mai", "jun",
          "jul", "ago", "set", "out", "nov", "dez", "total")

colunas = c("orcado", "realizado", "desvio", "desvio%")


as.vector(sapply(meses,function(x) paste(colunas,x,sep="_")))

 [1] "orcado_jan"      "realizado_jan"   "desvio_jan"      "desvio%_jan"     "orcado_fev"      "realizado_fev"   "desvio_fev"      "desvio%_fev"    
 [9] "orcado_mar"      "realizado_mar"   "desvio_mar"      "desvio%_mar"     "orcado_abr"      "realizado_abr"   "desvio_abr"      "desvio%_abr"    
[17] "orcado_mai"      "realizado_mai"   "desvio_mai"      "desvio%_mai"     "orcado_jun"      "realizado_jun"   "desvio_jun"      "desvio%_jun"    
[25] "orcado_jul"      "realizado_jul"   "desvio_jul"      "desvio%_jul"     "orcado_ago"      "realizado_ago"   "desvio_ago"      "desvio%_ago"    
[33] "orcado_set"      "realizado_set"   "desvio_set"      "desvio%_set"     "orcado_out"      "realizado_out"   "desvio_out"      "desvio%_out"    
[41] "orcado_nov"      "realizado_nov"   "desvio_nov"      "desvio%_nov"     "orcado_dez"      "realizado_dez"   "desvio_dez"      "desvio%_dez"    
[49] "orcado_total"    "realizado_total" "desvio_total"    "desvio%_total"  

Here you go:

results <- c()
for(x in meses){
+     results <- c(results, paste(colunas, x, sep = "_"))
+ }
> results
 [1] "orcado_jan"      "realizado_jan"   "desvio_jan"      "desvio%_jan"     "orcado_fev"     
 [6] "realizado_fev"   "desvio_fev"      "desvio%_fev"     "orcado_mar"      "realizado_mar"  
[11] "desvio_mar"      "desvio%_mar"     "orcado_abr"      "realizado_abr"   "desvio_abr"     
[16] "desvio%_abr"     "orcado_mai"      "realizado_mai"   "desvio_mai"      "desvio%_mai"    
[21] "orcado_jun"      "realizado_jun"   "desvio_jun"      "desvio%_jun"     "orcado_jul"     
[26] "realizado_jul"   "desvio_jul"      "desvio%_jul"     "orcado_ago"      "realizado_ago"  
[31] "desvio_ago"      "desvio%_ago"     "orcado_set"      "realizado_set"   "desvio_set"     
[36] "desvio%_set"     "orcado_out"      "realizado_out"   "desvio_out"      "desvio%_out"    
[41] "orcado_nov"      "realizado_nov"   "desvio_nov"      "desvio%_nov"     "orcado_dez"     
[46] "realizado_dez"   "desvio_dez"      "desvio%_dez"     "orcado_total"    "realizado_total"
[51] "desvio_total"    "desvio%_total"

The results <- c(results, paste(colunas, x, sep = "_")) can be pretty slow, because we are copying whole results vector, but in case of small amount of data it should be just fine.

Using your nomes vector:

meses = c("jan", "fev", "mar", "abr", "mai", "jun",
          "jul", "ago", "set", "out", "nov", "dez", "total")

colunas = c("orcado", "realizado", "desvio", "desvio%")

nomes = c()

for (x in meses) {
  y <- paste(colunas, x, sep = "_")
  nomes <- c(nomes,y)
}

[1] "orcado_jan"      "realizado_jan"   "desvio_jan"      "desvio%_jan"     "orcado_fev"      "realizado_fev"  
 [7] "desvio_fev"      "desvio%_fev"     "orcado_mar"      "realizado_mar"   "desvio_mar"      "desvio%_mar"    
[13] "orcado_abr"      "realizado_abr"   "desvio_abr"      "desvio%_abr"     "orcado_mai"      "realizado_mai"  
[19] "desvio_mai"      "desvio%_mai"     "orcado_jun"      "realizado_jun"   "desvio_jun"      "desvio%_jun"    
[25] "orcado_jul"      "realizado_jul"   "desvio_jul"      "desvio%_jul"     "orcado_ago"      "realizado_ago"  
[31] "desvio_ago"      "desvio%_ago"     "orcado_set"      "realizado_set"   "desvio_set"      "desvio%_set"    
[37] "orcado_out"      "realizado_out"   "desvio_out"      "desvio%_out"     "orcado_nov"      "realizado_nov"  
[43] "desvio_nov"      "desvio%_nov"     "orcado_dez"      "realizado_dez"   "desvio_dez"      "desvio%_dez"    
[49] "orcado_total"    "realizado_total" "desvio_total"    "desvio%_total" 
Related