在这个优化问题中如何避免多个for循环

在这个优化问题中如何避免多个for循环,r,for-loop,R,For Loop,我试图在表“brand_1”和“brand_2”中找到列“a”和“b”的组合 最大化我的目标函数“obj”。如果不写4个for循环,我怎么能做到这一点 下面是一个简单的代码来说明我的问题。我还需要对它进行概括以使其适用于任意数量的表(不仅仅是“brand_1”和“brand_2”),每个表始终有两列(“a”和“b”)。非常感谢 brand_1 <- data.frame(a = c(1, 3), b = c(5, 2)) brand_2 <- data.frame(a = c(5,

我试图在表“brand_1”和“brand_2”中找到列“a”和“b”的组合 最大化我的目标函数“obj”。如果不写4个for循环,我怎么能做到这一点

下面是一个简单的代码来说明我的问题。我还需要对它进行概括以使其适用于任意数量的表(不仅仅是“brand_1”和“brand_2”),每个表始终有两列(“a”和“b”)。非常感谢

brand_1 <- data.frame(a = c(1, 3),  b = c(5, 2))
brand_2 <- data.frame(a = c(5, 4),  b = c(2, 1))

num_row <- nrow(brand_1) # where nrow(brand_1) = nrow(brand_2)

all_a1 <- vector()
all_b1 <- vector()
all_a2 <- vector()
all_b2 <- vector()
all_obj <- vector()

for (a1 in 1:num_row) {
  for (b1 in 1:num_row) {
    for (a2 in 1:num_row) {
      for (b2 in 1:num_row) {
        obj <- brand_1[a1, "a"] + brand_1[b1, "b"] + brand_2[a2, "a"] + brand_2[b2, "b"]
        all_a1  <- c(all_a1, brand_1[a1, "a"])
        all_b1  <- c(all_b1, brand_1[b1, "b"])
        all_a2  <- c(all_a2, brand_2[a2, "a"])
        all_b2  <- c(all_b2, brand_2[b2, "b"])
        
        all_obj <- c(all_obj, obj)
      }
    }
  }
}

out <- data.frame(all_a1, all_b1, all_a2, all_b2, all_obj)

brand_1我们可以使用
expand.grid

out <- expand.grid(c(brand_1, brand_2))
names(out) <- make.unique(names(out))
out$all_obj <- rowSums(out)

或使用
完成

library(dplyr)
library(tidyr)
bind_cols(brand_1, brand_2)  %>%
    complete(!!! rlang::syms(names(.))) %>% 
    mutate(all_obj = rowSums(.))

我们可以使用
expand.grid

out <- expand.grid(c(brand_1, brand_2))
names(out) <- make.unique(names(out))
out$all_obj <- rowSums(out)

或使用
完成

library(dplyr)
library(tidyr)
bind_cols(brand_1, brand_2)  %>%
    complete(!!! rlang::syms(names(.))) %>% 
    mutate(all_obj = rowSums(.))

对于具有任意数量数据帧的通用解决方案,我们可以使用
ls
获取其中包含
“brand”
的所有对象,使用
mget
将它们放入列表中,根据这些对象名称重命名列名,并使用
交叉
生成它们的所有可能组合。最后,您可以使用
rowSums
对行进行求和

library(tidyverse)

mget(ls(pattern = 'brand')) %>%
  imap_dfc(~setNames(., paste0(names(.x), sub('.*_', '', .y)))) %>%
  do.call(crossing, .) %>%
  mutate(all_obj = rowSums(.))

#      a1    b1    a2    b2 all_obj
#   <dbl> <dbl> <dbl> <dbl>   <dbl>
# 1     1     2     4     1       8
# 2     1     2     4     2       9
# 3     1     2     5     1       9
# 4     1     2     5     2      10
# 5     1     5     4     1      11
# 6     1     5     4     2      12
# 7     1     5     5     1      12
# 8     1     5     5     2      13
# 9     3     2     4     1      10
#10     3     2     4     2      11
#11     3     2     5     1      11
#12     3     2     5     2      12
#13     3     5     4     1      13
#14     3     5     4     2      14
#15     3     5     5     1      14
#16     3     5     5     2      15
库(tidyverse)
mget(ls(模式=‘品牌’)%%>%
imap_dfc(~setNames(、paste0(名称(.x)、sub('.'.\u'、'.y)))%>%
do.呼叫(交叉口),%%>%
突变(所有对象=行和()
#a1 b1 a2 b2所有对象
#         
# 1     1     2     4     1       8
# 2     1     2     4     2       9
# 3     1     2     5     1       9
# 4     1     2     5     2      10
# 5     1     5     4     1      11
# 6     1     5     4     2      12
# 7     1     5     5     1      12
# 8     1     5     5     2      13
# 9     3     2     4     1      10
#10     3     2     4     2      11
#11     3     2     5     1      11
#12     3     2     5     2      12
#13     3     5     4     1      13
#14     3     5     4     2      14
#15     3     5     5     1      14
#16     3     5     5     2      15

对于具有任意数量数据帧的通用解决方案,我们可以使用
ls
获取其中包含
“brand”
的所有对象,使用
mget
将它们放入列表中,根据这些对象名称重命名列名,并使用
交叉
生成它们所有可能的组合。最后,您可以使用
rowSums
对行进行求和

library(tidyverse)

mget(ls(pattern = 'brand')) %>%
  imap_dfc(~setNames(., paste0(names(.x), sub('.*_', '', .y)))) %>%
  do.call(crossing, .) %>%
  mutate(all_obj = rowSums(.))

#      a1    b1    a2    b2 all_obj
#   <dbl> <dbl> <dbl> <dbl>   <dbl>
# 1     1     2     4     1       8
# 2     1     2     4     2       9
# 3     1     2     5     1       9
# 4     1     2     5     2      10
# 5     1     5     4     1      11
# 6     1     5     4     2      12
# 7     1     5     5     1      12
# 8     1     5     5     2      13
# 9     3     2     4     1      10
#10     3     2     4     2      11
#11     3     2     5     1      11
#12     3     2     5     2      12
#13     3     5     4     1      13
#14     3     5     4     2      14
#15     3     5     5     1      14
#16     3     5     5     2      15
库(tidyverse)
mget(ls(模式=‘品牌’)%%>%
imap_dfc(~setNames(、paste0(名称(.x)、sub('.'.\u'、'.y)))%>%
do.呼叫(交叉口),%%>%
突变(所有对象=行和()
#a1 b1 a2 b2所有对象
#         
# 1     1     2     4     1       8
# 2     1     2     4     2       9
# 3     1     2     5     1       9
# 4     1     2     5     2      10
# 5     1     5     4     1      11
# 6     1     5     4     2      12
# 7     1     5     5     1      12
# 8     1     5     5     2      13
# 9     3     2     4     1      10
#10     3     2     4     2      11
#11     3     2     5     1      11
#12     3     2     5     2      12
#13     3     5     4     1      13
#14     3     5     4     2      14
#15     3     5     5     1      14
#16     3     5     5     2      15

谢谢,阿克伦!但是我们如何才能使它变得通用(即brad_1,brand_2,…,brand_n)?@Ketty当然,我们可以将所有元素加载为
mget(ls(pattern='^brand\\d+$)%%>%bind_cols%%>%complete(!!!rlang::syms(names)()%%>%mutate(all_obj=rowSums)()
谢谢,akrun!但是我们怎样才能使它变得通用(例如对于brad_1,brand_2,…,brand_n)?@Ketty当然,我们可以将所有元素加载为
mget(ls(pattern='^brand\\d+$)%%>%bind_cols%%>%complete(!!!rlang::syms(names)()%%>%mutate(all_obj=rowSums)()