将计算应用于数据帧的每个可能的唯一子集

时间:2016-12-12 16:56:43

标签: r

我遇到以下问题:我的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))

1 个答案:

答案 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