выбор столбцов с использованием двоичной таблицы в R - PullRequest
0 голосов
/ 09 марта 2019

У меня есть фрейм данных x в следующем порядке

             date       c1   c2   c3  c4    c5    c6   c7   c8   c9
             Jan-08     12   23   12  11    10    1    49   34   23    
             Feb-08     14   33   11  11    20    11   29   44   23    

и так далее ...

У меня есть другая двоичная матрица, которая имеет

                     1    3    6
              1      0    0    1
              2      0    0    0 
              3      0    1    0
              4      1    0    0
              5      0    1    0 
              6      1    0    0  
              7      0    0    0
              8      1    1    0
              9      0    1    1

Я хочу посмотреть на мою двоичную матрицу и создать новую таблицу для каждого столбца в моей двоичной матрице, чтобы новая таблица содержала только столбцы из фрейма данных x, которые равны 1 в двоичной таблице.Таким образом, в результате мы создадим 3 фрейма данных, т.е. data_frame_1, data_frame_3 и data_frame_6, где data_frame_1 имеет формат

                     date    c4    c6     c8        
                     Jan-08  11    1      34 
                     Feb-08  11    11     44

data_frame_3 будет

                     date    c3    c5     c8   c9        
                     Jan-08  12    10     34   23 
                     Feb-08  11    20     44   23

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Используя lapply, мы можем перебирать столбцы двоичной матрицы mat и преобразовывать двоичную матрицу в логический вектор, который используется для подстановки столбцов из x кадра данных.

lapply(1:ncol(mat), function(i) cbind(x[1], x[-1][as.logical(mat[, i])]))

#[[1]]
#    date c4 c6 c8
#1 Jan-08 11  1 34
#2 Feb-08 11 11 44

#[[2]]
#    date c3 c5 c8 c9
#1 Jan-08 12 10 34 23
#2 Feb-08 11 20 44 23

#[[3]]
#    date c1 c9
#1 Jan-08 12 23
#2 Feb-08 14 23
0 голосов
/ 09 марта 2019

Вы можете использовать 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
# 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...