Вы можете использовать apply
для итерации по столбцам двоичной матрицы, bin
, под-настройками фрейма данных, dat
:
# create test data
set.seed(1)
dat <- as.data.frame(matrix(rnorm(18), nrow=2))
colnames(dat) <- paste0('c', 1:9)
dat
# c1 c2 c3 c4 c5 c6 c7 c8
# 1 -0.6264538 -0.8356286 0.3295078 0.4874291 0.5757814 1.5117812 -0.6212406 1.12493092
# 2 0.1836433 1.5952808 -0.8204684 0.7383247 -0.3053884 0.3898432 -2.2146999 -0.04493361
# c9
# 1 -0.01619026
# 2 0.94383621
bin <- matrix(sample(0:1, 27, replace = TRUE), nrow = 9)
bin
# [,1] [,2] [,3]
# [1,] 1 1 0
# [2,] 0 0 0
# [3,] 1 0 0
# [4,] 0 1 1
# [5,] 1 1 1
# [6,] 1 0 0
# [7,] 1 1 1
# [8,] 1 0 0
# [9,] 1 0 0
# subset columns of dat, using binary vector columns defined in bin;
# drop = FALSE is included to prevent any columns with only a single "1" from
# being cast to a vector
apply(bin, 2, function(x) { dat[, as.logical(x), drop = FALSE] })
# [[1]]
# c1 c3 c5 c6 c7 c8 c9
# 1 -0.6264538 0.3295078 0.5757814 1.5117812 -0.6212406 1.12493092 -0.01619026
# 2 0.1836433 -0.8204684 -0.3053884 0.3898432 -2.2146999 -0.04493361 0.94383621
#
# [[2]]
# c1 c4 c5 c7
# 1 -0.6264538 0.4874291 0.5757814 -0.6212406
# 2 0.1836433 0.7383247 -0.3053884 -2.2146999
#
# [[3]]
# c4 c5 c7
# 1 0.4874291 0.5757814 -0.6212406
# 2 0.7383247 -0.3053884 -2.2146999
#