一组固定参数组合的所有值组合
All value combinations for a fixed set of parameter combinations
问题
我正在寻找一种方法来创建一组参数及其值的所有可能组合的列表,其中每个参数在输出中只存在一次。示例输入集如下所示:
sampleData = data.frame(Parameter= c("A","B","B","C","C","C","D","D"),
Value = c(1,0.9,1,0.8,1,1.2,0.8,1.1))
Parameter Value
1 A 1.0
2 B 0.9
3 B 1.0
4 C 0.8
5 C 1.0
6 C 1.2
7 D 0.8
8 D 1.1
所需的输出是所有唯一 ABCD 组合的列表,因此列表的前两个元素是例如
[[1]]
Parameter Value
1 A 1.0
2 B 0.9
3 C 0.8
4 D 0.8
[[2]]
Parameter Value
1 A 1.0
2 B 1.0
3 C 0.8
4 D 0.8
我目前的尝试
我查看了 gtools
包中的 combinations
函数,下面的函数接近我想要的
combinations(n = nrow(sampleData),
r = length(unique(sampleData$Parameter)),
v = paste0(sampleData$Parameter,"_",sampleData$Value))
通过一些 post 处理,我将能够得到想要的结果。
但是 combinations
也会产生像
这样的结果
Parameter Value
1 A 1.0
2 B 0.9
3 B 1.0
4 D 0.8
即一个(或多个)参数多次出现。
我将能够 post- 处理这个,但是组合的输出很快变大(对于这个例子已经是 70,增长为 n
和 r!
)同时所需的输出列表增长速度要慢得多(在此示例中为 12,增长速度要慢得多)。
所以我的问题是:是否有一种(相对)有效的方法来生成所需的 ABCD 值组合输出,而无需首先生成更大的集合然后去除无效组合?
我想你正在寻找 expand.grid()
。
以下将 return 一个数据框,每个唯一组合排成一行:
library(dplyr)
df <- sampleData %>%
split(.$Parameter) %>% # create a dataframe of values for each parameter
lapply(function(df){df$Value}) %>% # extract the values for each parameter as an array
expand.grid() # generate all combinations
> df
A B C D
1 1 0.9 0.8 0.8
2 1 1.0 0.8 0.8
3 1 0.9 1.0 0.8
4 1 1.0 1.0 0.8
5 1 0.9 1.2 0.8
6 1 1.0 1.2 0.8
7 1 0.9 0.8 1.1
8 1 1.0 0.8 1.1
9 1 0.9 1.0 1.1
10 1 1.0 1.0 1.1
11 1 0.9 1.2 1.1
12 1 1.0 1.2 1.1
如果您希望将结果转换为数据框列表:
library(tidyr)
df %>%
mutate(combination = row_number()) %>%
gather(Parameter, Value, -combination) %>%
split(.$combination) %>%
lapply(function(d){d[,-1]})
$`1`
Parameter Value
1 A 1.0
13 B 0.9
25 C 0.8
37 D 0.8
$`2`
Parameter Value
2 A 1.0
14 B 1.0
26 C 0.8
38 D 0.8
...
问题
我正在寻找一种方法来创建一组参数及其值的所有可能组合的列表,其中每个参数在输出中只存在一次。示例输入集如下所示:
sampleData = data.frame(Parameter= c("A","B","B","C","C","C","D","D"),
Value = c(1,0.9,1,0.8,1,1.2,0.8,1.1))
Parameter Value
1 A 1.0
2 B 0.9
3 B 1.0
4 C 0.8
5 C 1.0
6 C 1.2
7 D 0.8
8 D 1.1
所需的输出是所有唯一 ABCD 组合的列表,因此列表的前两个元素是例如
[[1]]
Parameter Value
1 A 1.0
2 B 0.9
3 C 0.8
4 D 0.8
[[2]]
Parameter Value
1 A 1.0
2 B 1.0
3 C 0.8
4 D 0.8
我目前的尝试
我查看了 gtools
包中的 combinations
函数,下面的函数接近我想要的
combinations(n = nrow(sampleData),
r = length(unique(sampleData$Parameter)),
v = paste0(sampleData$Parameter,"_",sampleData$Value))
通过一些 post 处理,我将能够得到想要的结果。
但是 combinations
也会产生像
Parameter Value
1 A 1.0
2 B 0.9
3 B 1.0
4 D 0.8
即一个(或多个)参数多次出现。
我将能够 post- 处理这个,但是组合的输出很快变大(对于这个例子已经是 70,增长为 n
和 r!
)同时所需的输出列表增长速度要慢得多(在此示例中为 12,增长速度要慢得多)。
所以我的问题是:是否有一种(相对)有效的方法来生成所需的 ABCD 值组合输出,而无需首先生成更大的集合然后去除无效组合?
我想你正在寻找 expand.grid()
。
以下将 return 一个数据框,每个唯一组合排成一行:
library(dplyr)
df <- sampleData %>%
split(.$Parameter) %>% # create a dataframe of values for each parameter
lapply(function(df){df$Value}) %>% # extract the values for each parameter as an array
expand.grid() # generate all combinations
> df
A B C D
1 1 0.9 0.8 0.8
2 1 1.0 0.8 0.8
3 1 0.9 1.0 0.8
4 1 1.0 1.0 0.8
5 1 0.9 1.2 0.8
6 1 1.0 1.2 0.8
7 1 0.9 0.8 1.1
8 1 1.0 0.8 1.1
9 1 0.9 1.0 1.1
10 1 1.0 1.0 1.1
11 1 0.9 1.2 1.1
12 1 1.0 1.2 1.1
如果您希望将结果转换为数据框列表:
library(tidyr)
df %>%
mutate(combination = row_number()) %>%
gather(Parameter, Value, -combination) %>%
split(.$combination) %>%
lapply(function(d){d[,-1]})
$`1`
Parameter Value
1 A 1.0
13 B 0.9
25 C 0.8
37 D 0.8
$`2`
Parameter Value
2 A 1.0
14 B 1.0
26 C 0.8
38 D 0.8
...