[英]How to create a matrix from all possible combinations of 2 or more matrices?
[英]Find minimum sum from all possible split combinations in a matrix
如果我有一個具有以下結構的矩陣:
A B C D E F
A - 12 3 5 7 9
B - - 8 11 6 2
C - - - 10 1 7
D - - - - 17 1
E - - - - - 19
F - - - - - -
我想將 AF 分成 2 組並找到總和最小的組合。 (如果組合是 [ACD, BEF],則總和將為 (3+5+10)+(6+2+19)=45 。)
在真實的數據集中,會有一個 2700X2700 的矩陣,我想將它們分成 13 組 200 個項目和 1 組 100 個項目(13x200+1x100 = 2700)。 python 或 R 代碼中是否有處理此問題的好方法?
謝謝你。
更新:
謝謝@jay.sf。 基因 2 的列表確實用模擬數據集回答了我的問題,但在輸出中,基因 1 列表總是“DEF”。
我可以忽略以下行 "attr(s, "group1") <- g1"
但是,當涉及到多個組和大型數據集(2700 行 X 列分成 100 個組)時,comboGeneral() 無法工作。 目前,我正在嘗試使用 comboGroups() 代替,盡管其參數中沒有參數“FUN”。
您可以使用RcppAlgos::comboGeneral
,它基本上是combn
的 C 版本,應該足夠快地找到列組合。
下面的代碼的邏輯是找到三個列名的所有組合,將它們子集組1和否定到組2和sum
兩者一起和列表輸出。 attr
將 sum 作為屬性分配給列表元素。
stopifnot(all.equal(rownames(m), colnames(m)))
stopifnot(ncol(m) %% 2 == 0)
n <- colnames(m)
library(RcppAlgos)
r <- comboGeneral(n, length(n)/2, FUN=function(i) {
l <- length(i)
g1 <- i
g2 <- n[!n %in% i]
s <- sum(c(m[g1, g1], m[g2, g2]), na.rm=TRUE)
attr(s, "group1") <- g1
attr(s, "group2") <- g2
return(s)
})
現在,我們可以從屬性中獲取總和。
sums <- sapply(r, attr, "sum")
table(sums)
# 25 30 43 45 46 51 53 55 60 64
# 2 2 2 2 2 2 2 2 2 2
最后,為了得到結果,我們對min
子集化。
r[sums %in% min(sums)]
# [[1]]
# [[1]]$g1
# [1] "D" "E" "F"
#
# [[1]]$g2
# [1] "B" "D" "F"
#
# attr(,"sum")
# [1] 25
#
# [[2]]
# [[2]]$g1
# [1] "D" "E" "F"
#
# [[2]]$g2
# [1] "A" "C" "E"
#
# attr(,"sum")
# [1] 25
數據:
m <- structure(c(NA, NA, NA, NA, NA, NA, 12L, NA, NA, NA, NA, NA,
3L, 8L, NA, NA, NA, NA, 5L, 11L, 10L, NA, NA, NA, 7L, 6L, 1L,
17L, NA, NA, 9L, 2L, 7L, 1L, 19L, NA), .Dim = c(6L, 6L), .Dimnames = list(
c("A", "B", "C", "D", "E", "F"), c("A", "B", "C", "D", "E",
"F")))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.