У меня есть разреженный двоичный файл data.frame
, который выглядит так
set.seed(123)
dat <- as.data.frame(matrix(rep(round(runif(40,0,0.9),0),5),ncol = 20))
# > dat
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
# 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
# 2 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1
# 3 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
# 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 5 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
# 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 7 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0
# 8 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1
# 9 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
# 10 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
Мне нужно найти 3 столбца, которые минимизируют количество нулей, полученных при вызове rowSums
для этих столбцов.
Пример:
# > rowSums(dat[,1:3])
# [1] 2 2 2 3 2 2 0 2 0 1
#
# > rowSums(dat[,2:4])
# [1] 3 2 3 3 1 2 1 1 0 1
Здесь, когда я вызываю rowSums
для первых 3 столбцов, я получаю 2 нуля, а когда я вызываю rowSums
для столбцов 2:4
, я получаю только один 0
, поэтому второе решение было бы предпочтительнее.
Конечно, мне не нужно, чтобы столбцы располагались рядом друг с другом, когда я применяю rowSums
, поэтому мне нужно изучить все возможные комбинации (например, я хочу, чтобы rowSums
учитывал также случай ov V1+V5+V17
, ...), и если есть несколько «оптимальных» решений, я могу просто оставить одно из них.
Обратите внимание, что мои реальные data.frame
составляют 220 000 строк x 200 столбцов, поэтому мне нужен эффективный подход с точки зрения потребляемого времени/памяти.