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)))]