R 使用combn的最小值的所有组合列表

R 使用combn的最小值的所有组合列表,r,combn,R,Combn,以下是我的数据: [,1] [,2] [,3] [1,] 2 3 4 [2,] 2 3 5 [3,] 2 3 6 [4,] 2 4 5 [5,] 2 4 6 [6,] 2 4 2 [7,] 2 4 4 [8,] 2 4 9 [9,] 2 4 10 [10,] 2 4 3 如何找到大于25的第3列的所有组合?

以下是我的数据:

      [,1] [,2] [,3]
[1,]    2    3    4
[2,]    2    3    5
[3,]    2    3    6
[4,]    2    4    5
[5,]    2    4    6
[6,]    2    4    2
[7,]    2    4    4
[8,]    2    4    9
[9,]    2    4    10
[10,]   2    4    3

如何找到大于25的第3列的所有组合?我正在努力使用combn函数,因为帮助函数似乎不太直观

以下各项应适用于固定长度;对于所有长度可变的组合,都需要更高级的东西(编辑:参见@PLapointe的帖子(这应该是公认的答案)或只是一个简单的循环):

然后,您可以选择列和大于阈值的组合:

res[, colSums(res) >= 25]
然后,这将给出

    [,1] [,2]
[1,]    6    6
[2,]    9    9
[3,]   10   10
由于您现在有重复的条目(不确定是否需要它们),您可以简单地执行以下操作(或简单的循环):


以下各项应适用于固定长度;对于所有长度可变的组合,都需要更高级的东西(编辑:参见@PLapointe的帖子(这应该是公认的答案)或只是一个简单的循环):

然后,您可以选择列和大于阈值的组合:

res[, colSums(res) >= 25]
然后,这将给出

    [,1] [,2]
[1,]    6    6
[2,]    9    9
[3,]   10   10
由于您现在有重复的条目(不确定是否需要它们),您可以简单地执行以下操作(或简单的循环):


如果需要非循环版本:

x <- read.table(text="2    3    4
2    3    5
2    3    6
2    4    5
2    4    6
2    4    2
2    4    4
2    4    9
2    4    10
2    4    3",stringsAsFactors=FALSE, header=FALSE)

res <- Map(combn, list(x[,3]), seq_along(x[,3]), simplify = FALSE)
unlist(res, recursive = FALSE)[lapply(unlist(res, recursive = FALSE),sum)>=25]

[[1]]
[1]  6  9 10

[[2]]
[1]  6  9 10

[[3]]
[1]  4  5  6 10
...
[[613]]
[1]  4  6  5  6  2  4  9 10  3

[[614]]
[1]  5  6  5  6  2  4  9 10  3

[[615]]
 [1]  4  5  6  5  6  2  4  9 10  3

x如果需要非循环版本:

x <- read.table(text="2    3    4
2    3    5
2    3    6
2    4    5
2    4    6
2    4    2
2    4    4
2    4    9
2    4    10
2    4    3",stringsAsFactors=FALSE, header=FALSE)

res <- Map(combn, list(x[,3]), seq_along(x[,3]), simplify = FALSE)
unlist(res, recursive = FALSE)[lapply(unlist(res, recursive = FALSE),sum)>=25]

[[1]]
[1]  6  9 10

[[2]]
[1]  6  9 10

[[3]]
[1]  4  5  6 10
...
[[613]]
[1]  4  6  5  6  2  4  9 10  3

[[614]]
[1]  5  6  5  6  2  4  9 10  3

[[615]]
 [1]  4  5  6  5  6  2  4  9 10  3


x前两列是否有任何意义,即是否也应该考虑它们?还有,操作是什么?总和乘法?指数化?请扩展您的问题,以包括更多详细信息以及您的预期输出。不需要考虑它们,尽管我稍后将它们保留在那里,但我希望分配行名称并使用结果向量引用它们。我希望返回大于(或等于*)的第3列可能组合的向量列表到25岁。例如,一个组合是[8、][9、]和[3、]。输出需要是一个向量列表,所有可能的组合超过25个。我将重命名每一行的名称1,…,名称10,列表应类似于[[name1]],并具有以下组合。因此,第3栏的所有条目也可以是一个组合。前两栏是否有任何意义,即它们是否也应该被考虑?还有,操作是什么?总和乘法?指数化?请扩展您的问题,以包括更多详细信息以及您的预期输出。不需要考虑它们,尽管我稍后将它们保留在那里,但我希望分配行名称并使用结果向量引用它们。我希望返回大于(或等于*)的第3列可能组合的向量列表到25岁。例如,一个组合是[8、][9、]和[3、]。输出需要是一个向量列表,所有可能的组合超过25个。我将重命名每一行的名称1,…,名称10,列表应类似于[[name1]],并具有以下组合。因此,第3列的所有条目也可以是一个组合。我可以用for循环重复其他组合,或者只单独进行?@Aesler:循环可能会在1和长度(x)之间运行。但我想还有比这更聪明的解决方案。我会调查……我可以用for循环重复其他组合,或者只是单独做?@Aesler:循环可能会工作,它可以在1和长度(x)之间运行。但我想还有比这更聪明的解决方案。将调查…这比我的好,应该是被接受的答案(投票)。我相应地编辑了我的答案;我想他很快就会用你的回答作为公认的答案……谢谢你们两位的帮助。另一个快速的问题是,既然你对结果向量很有帮助,我该如何返回行名而不是向量值?我还没有添加名称,但我正准备添加。我还有最后一个问题(我保证!),目前我有很多组合不是很有用,因为我对满足最小标准>25的组合感兴趣,所以一旦向量值的总和达到25,我希望向量“断开”以删除不必要的组合。例如,如果第3列中的4个值等于26,则无需继续添加向量值。我仍然希望列表中所有可能的组合都有符合此标准的行名。太棒了-非常感谢。我试着在for循环中使用for循环,但在尝试删除每个列表的元素时,事情变得一团糟。这比我的好,应该是公认的答案(向上投票)。我相应地编辑了我的答案;我想他很快就会用你的回答作为公认的答案……谢谢你们两位的帮助。另一个快速的问题是,既然你对结果向量很有帮助,我该如何返回行名而不是向量值?我还没有添加名称,但我正准备添加。我还有最后一个问题(我保证!),目前我有很多组合不是很有用,因为我对满足最小标准>25的组合感兴趣,所以一旦向量值的总和达到25,我希望向量“断开”以删除不必要的组合。例如,如果第3列中的4个值等于26,则无需继续添加向量值。我仍然希望列表中所有可能的组合都有符合此标准的行名。太棒了-非常感谢。我尝试在for循环中使用for循环,试图删除每个列表中的元素时,事情变得一团糟。
x <- read.table(text="2    3    4
2    3    5
2    3    6
2    4    5
2    4    6
2    4    2
2    4    4
2    4    9
2    4    10
2    4    3",stringsAsFactors=FALSE, header=FALSE)

res <- Map(combn, list(x[,3]), seq_along(x[,3]), simplify = FALSE)
unlist(res, recursive = FALSE)[lapply(unlist(res, recursive = FALSE),sum)>=25]

[[1]]
[1]  6  9 10

[[2]]
[1]  6  9 10

[[3]]
[1]  4  5  6 10
...
[[613]]
[1]  4  6  5  6  2  4  9 10  3

[[614]]
[1]  5  6  5  6  2  4  9 10  3

[[615]]
 [1]  4  5  6  5  6  2  4  9 10  3
rownames(x) <- paste0("row",1:10)
res <- list(Map(combn, list(x[,3]), seq_along(x[,3]), simplify = FALSE),
 Map(combn, list(rownames(x)), seq_along(rownames(x)), simplify = FALSE))
unlist(res[[2]], recursive = FALSE)[lapply(unlist(res[[1]], recursive = FALSE),sum)>=25]

[[1]]
[1] "row3" "row8" "row9"

[[2]]
[1] "row5" "row8" "row9"

[[3]]
[1] "row1" "row2" "row3" "row9"
...
[[613]]
[1] "row1"  "row3"  "row4"  "row5"  "row6"  "row7"  "row8"  "row9"  "row10"

[[614]]
[1] "row2"  "row3"  "row4"  "row5"  "row6"  "row7"  "row8"  "row9"  "row10"

[[615]]
 [1] "row1"  "row2"  "row3"  "row4"  "row5"  "row6"  "row7"  "row8"  "row9"  "row10"
res <- Map(combn, list(x[,3]), seq_along(x[,3]), simplify = FALSE)
res3 <- unlist(res, recursive = FALSE)[lapply(unlist(res, recursive = FALSE),sum)>=25]
res3[which(rapply(res3,sum)==min(rapply(res3,sum)))]
rownames(x) <- paste0("row",1:10)
res4 <- list(Map(combn, list(x[,3]), seq_along(x[,3]), simplify = FALSE),
            Map(combn, list(rownames(x)), seq_along(rownames(x)), simplify = FALSE))
unlist(res4[[2]], recursive = FALSE)[lapply(unlist(res4[[1]], recursive = FALSE),sum)>=25][which(rapply(res3,sum)==min(rapply(res3,sum)))]