создать матрицу на основе другой матрицы, содержащей индекс элемента со значением n - PullRequest
1 голос
/ 18 апреля 2020

У меня есть матрица, содержащая индексы идентификаторов столбцов для элемента матрицы, который я хочу создать.

>  index
         [,1] [,2] [,3] 
    [1,]    1    NA   3    
    [2,]    1    2    NA    
    [3,]    1    3    NA    
    [4,]    1    3    5    
    [5,]    1    4    5    
    [6,]    2    NA   NA    
    [7,]    3    4    NA  

В примере первой строки есть столбец id 1, NA, 3, который установите для него значение 1 и игнорируйте NA

во второй строке есть столбец id 1, 2, NA, для которого установлено значение 1

, теперь я хочу создать следующую матрицу:

     a1 a2 a3  a4 a5
[1,]  1  0  1  0  0
[2,]  1  1  0  0  0
[3,]  1  0  1  0  0
[4,]  1  0  1  0  1
[5,]  1  0  0  1  1  
[6,]  0  1  0  0  0
[7,]  0  0  1  1  0

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Мы могли бы создать матрицу с 0, где количество строк такое же, как index, а количество столбцов - максимальное значение в index. Затем мы можем создать строку, матрицу столбца, используя функцию row в качестве индекса строки и значения index в качестве индекса столбца и превратить их в 1.

mat <- matrix(0, ncol = max(index, na.rm = TRUE), nrow = nrow(index))
mat[cbind(c(row(index)), c(index))] <- 1
mat

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    1    0    0
#[2,]    1    1    0    0    0
#[3,]    1    0    1    0    0
#[4,]    1    0    1    0    1
#[5,]    1    0    0    1    1
#[6,]    0    1    0    0    0
#[7,]    0    0    1    1    0

data

index <- structure(c(1, 1, 1, 1, 1, 2, 3, NA, 2, 3, 3, 4, NA, 4, 3, NA, 
         NA, 5, 5, NA, NA), .Dim = c(7L, 3L))
0 голосов
/ 18 апреля 2020

Мы также можем использовать rep для создания индекса строки

mat <- matrix(0, ncol = max(index, na.rm = TRUE), nrow = nrow(index))
mat[cbind(rep(seq_len(nrow(index)), ncol(index)), c(index))] <- 1

data

index <- structure(c(1, 1, 1, 1, 1, 2, 3, NA, 2, 3, 3, 4, NA, 4, 3, NA, 
     NA, 5, 5, NA, NA), .Dim = c(7L, 3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...