Reputation: 43
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
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