我遇到以下问题:我的dataset
行超过50
行,约100,000
列,所有列都包含TRUE/FALSE
个值。在这个dataset
中,我想为max colSums
的每个可能的唯一子集计算50,49,48,..,2 rows
,例如,我想计算49行的所有子集中所有列的最大列总和。
下面介绍的蛮力方法在计算上是不可能的,例如(50,30)
生成4.7129212243e+13
个唯一组合,因此基于实际查找所有子集的方法(使用combn,combnPrim,powerset)或者expand.grind)显然不应该使用。怎么可以解决这个问题?
dummy<-structure(list(V1 = c(TRUE, TRUE, TRUE, TRUE), V2 = c(FALSE,
TRUE, FALSE, FALSE), V3 = c(TRUE, TRUE, FALSE, TRUE), V4 = c(TRUE,
FALSE, FALSE, TRUE), V5 = c(TRUE, TRUE, TRUE, TRUE), V6 = c(FALSE,
FALSE, FALSE, TRUE), V7 = c(TRUE, TRUE, FALSE, FALSE), V8 = c(TRUE,
TRUE, TRUE, TRUE), V9 = c(FALSE, FALSE, FALSE, FALSE), V10 = c(TRUE,
TRUE, TRUE, TRUE), V11 = c(TRUE, TRUE, TRUE, TRUE), V12 = c(FALSE,
TRUE, TRUE, TRUE), V13 = c(FALSE, TRUE, TRUE, TRUE), V14 = c(FALSE,
FALSE, FALSE, FALSE), V15 = c(TRUE, TRUE, TRUE, TRUE), V16 = c(FALSE,
FALSE, FALSE, FALSE), V17 = c(FALSE, TRUE, TRUE, FALSE), V18 = c(TRUE,
TRUE, TRUE, TRUE), V19 = c(FALSE, FALSE, FALSE, TRUE), V20 = c(TRUE,
TRUE, TRUE, TRUE)), .Names = c("V1", "V2", "V3", "V4", "V5",
"V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15",
"V16", "V17", "V18", "V19", "V20"), row.names = c("a", "b", "c",
"d"), class = "data.frame")
a<-combn(4,1)
b<-combn(4,2)
c<-combn(4,3)
results<-c()
results[1]<-max(colSums(dummy[b[,1],]),colSums(dummy[b[,2],]),colSums(dummy[b[,3],]),colSums(dummy[b[,4],]),colSums(dummy[b[,5],]),colSums(dummy[b[,6],]))
results[2]<-max(colSums(dummy[c[,1],]),colSums(dummy[c[,2],]),colSums(dummy[c[,3],]),colSums(dummy[c[,4],]))
results[3]<-max(colSums(dummy))
答案 0 :(得分:1)
只需x <- max(colSums(dummy))
(在所有行上)。对于所有n <= nrow(dummy) & n >= x
,存在n
行的子集,其中colSums的最大值也是x
(只需选择保留列{{1}的所有行的子集是which.max(colSums(dummy))
)。对于TRUE
,colSums的最大值为n < x
(只需选择列n
的所有元素均为which.max(colSums(dummy))
的任何子集。)
解决方案是TRUE
。