R 一组固定参数组合的所有值组合

R 一组固定参数组合的所有值组合,r,permutation,combinatorics,R,Permutation,Combinatorics,问题 我正在寻找一种方法来创建一组参数及其值的所有可能组合的列表,其中每个参数在输出中只存在一次。示例输入集如下所示: 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

问题

我正在寻找一种方法来创建一组参数及其值的所有可能组合的列表,其中每个参数在输出中只存在一次。示例输入集如下所示:

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))
通过一些后处理,我将能够得到想要的结果

但组合也会产生类似的结果

      Parameter Value
1         A   1.0
2         B   0.9
3         B   1.0
4         D   0.8
i、 e.一个或多个参数多次出现

我将能够对其进行后期处理,但组合的输出迅速增长,在本例中已经达到70,随着n和r的增长而增长!在本例中,虽然期望输出列表的增长速度要慢得多12,但adn的增长速度要慢得多


因此,我的问题是:是否有一种相对有效的方法来生成所需的ABCD值组合输出,而不必先生成更大的集合,然后去掉无效的组合?

我想您正在寻找expand.grid

以下内容将返回一行中每个唯一组合的数据帧:

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

我想你在找expand.grid

以下内容将返回一行中每个唯一组合的数据帧:

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

美好的我已经决定使用一个稍微不同的实现,但是根据您的回答,只需几分钟就可以弄清楚:combinationSet=expand.GridLapplySplitsSampleData,sampleData[,Parameter],functiondt$Value;combinationSet$setID=1:nrowcombinationSet;setDTcombinationSet;outputSet=MeltCombinationAsit,id.vars=setID[ordersetID]不错!我已经决定使用一个稍微不同的实现,但是根据您的回答,只需几分钟就可以弄清楚:combinationSet=expand.GridLapplySplitsSampleData,sampleData[,Parameter],functiondt$Value;combinationSet$setID=1:nrowcombinationSet;setDTcombinationSet;outputSet=MeltCombinationAsit,id.vars=setID[ordersetID]