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
1 つしか取得しない0
ため、2 番目のソリューションが優先されます。
もちろん、 を適用するときに列が隣り合っている必要はないので、考えられるすべての組み合わせを調べる必要があります (例: ov の場合も考慮しrowSums
たい...)。複数の「最適な」ソリューションがありますが、そのうちの 1 つだけを保持してもかまいません。rowSums
V1+V5+V17
私の実数data.frame
は 220.000 行 x 200 列であるため、消費される時間/メモリに関して効率的なアプローチが必要であることに注意してください。