Sriram Ananthakrishna
Sriram Ananthakrishna

Reputation: 43

dynamic for loops for generating combinations in R

Suppose I have 2 variables , "a" and "b". I need to generate all kinds of combinations of "a 0.1 b 0.1" all the way up to "a 0.3 b 0.3". I can easily do it by recursive nested for loops in R.

A =1
for (i in seq(0.1, 0.3, by = 0.1)) {
  for (j in seq(0.1, 0.3, by = 0.1)) {
      B = paste("a", i , "b", j)
      A = c(A, B) 
  }
}
A = A[-1]
A

My output will be

> A
[1] "a 0.1 b 0.1" "a 0.1 b 0.2" "a 0.1 b 0.3" "a 0.2 b 0.1" "a 0.2 b 0.2" "a 0.2 b 0.3" "a 0.3 b 0.1" "a 0.3 b 0.2" "a 0.3 b 0.3"

If I have 3 variables, then I have to include one more for loop.

A =1
for (i in seq(0.1, 0.3 , by = 0.1)) {
  for (j in seq(0.1, 0.3, by = 0.1)) {
    for (k in seq(0.1, 0.3, by = 0.1)) {
      B = paste("a", i , "b", j, "c",k)
      A = c(A, B) 
    }
  }
}
A = A[-1]
A
> A
 [1] "a 0.1 b 0.1 c 0.1" "a 0.1 b 0.1 c 0.2" "a 0.1 b 0.1 c 0.3" "a 0.1 b 0.2 c 0.1" "a 0.1 b 0.2 c 0.2" "a 0.1 b 0.2 c 0.3"
 [7] "a 0.1 b 0.3 c 0.1" "a 0.1 b 0.3 c 0.2" "a 0.1 b 0.3 c 0.3" "a 0.2 b 0.1 c 0.1" "a 0.2 b 0.1 c 0.2" "a 0.2 b 0.1 c 0.3"
[13] "a 0.2 b 0.2 c 0.1" "a 0.2 b 0.2 c 0.2" "a 0.2 b 0.2 c 0.3" "a 0.2 b 0.3 c 0.1" "a 0.2 b 0.3 c 0.2" "a 0.2 b 0.3 c 0.3"
[19] "a 0.3 b 0.1 c 0.1" "a 0.3 b 0.1 c 0.2" "a 0.3 b 0.1 c 0.3" "a 0.3 b 0.2 c 0.1" "a 0.3 b 0.2 c 0.2" "a 0.3 b 0.2 c 0.3"
[25] "a 0.3 b 0.3 c 0.1" "a 0.3 b 0.3 c 0.2" "a 0.3 b 0.3 c 0.3"
> 

But what if my variables(a,b) and my range (0.1 to 0.3) are dynamic? Is there any method of dynamically generating for loops? Or any better way to address this problem?

Upvotes: 2

Views: 198

Answers (1)

Vivek Kalyanarangan
Vivek Kalyanarangan

Reputation: 9081

Use -

var1 <- paste("a",seq(0.1, 0.3, by = 0.1),sep=" ")
var2 <- paste("b",seq(0.1, 0.3, by = 0.1),sep=" ")
var3 <- paste("c",seq(0.1, 0.3, by = 0.1),sep=" ")
vars <- list(var1,var2,var3)

do.call(paste, as.data.frame(expand.grid(vars), stringsAsFactors=FALSE))

Output

[1] "a 0.1 b 0.1 c 0.1" "a 0.2 b 0.1 c 0.1" "a 0.3 b 0.1 c 0.1" "a 0.1 b 0.2 c 0.1"
 [5] "a 0.2 b 0.2 c 0.1" "a 0.3 b 0.2 c 0.1" "a 0.1 b 0.3 c 0.1" "a 0.2 b 0.3 c 0.1"
 [9] "a 0.3 b 0.3 c 0.1" "a 0.1 b 0.1 c 0.2" "a 0.2 b 0.1 c 0.2" "a 0.3 b 0.1 c 0.2"
[13] "a 0.1 b 0.2 c 0.2" "a 0.2 b 0.2 c 0.2" "a 0.3 b 0.2 c 0.2" "a 0.1 b 0.3 c 0.2"
[17] "a 0.2 b 0.3 c 0.2" "a 0.3 b 0.3 c 0.2" "a 0.1 b 0.1 c 0.3" "a 0.2 b 0.1 c 0.3"
[21] "a 0.3 b 0.1 c 0.3" "a 0.1 b 0.2 c 0.3" "a 0.2 b 0.2 c 0.3" "a 0.3 b 0.2 c 0.3"
[25] "a 0.1 b 0.3 c 0.3" "a 0.2 b 0.3 c 0.3" "a 0.3 b 0.3 c 0.3"

Explanation

var1,var2,var3 have been designed just for example's sake.

Use the expand.grid() to pass a list for variables like vars.

The vars can contain the list of variables that you dynamically generate the combinations out of.

Upvotes: 2

Related Questions