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