2016-07-17 487 views
7

Mi piacerebbe convertire una matrice di valori in una matrice di "bit".come convertire una matrice di valori in una matrice binaria

Sono stato alla ricerca di soluzioni e ho trovato this, che sembra essere parte di una soluzione. Proverò a spiegare quello che sto cercando. Ho una matrice come

> x<-matrix(1:20,5,4) 
> x 
    [,1] [,2] [,3] [,4] 
[1,] 1 6 11 16 
[2,] 2 7 12 17 
[3,] 3 8 13 18 
[4,] 4 9 14 19 
[5,] 5 10 15 20 

che desidero convertire in

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
    1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
    2 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 
    3 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 
    4 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 
    5 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 

quindi per ogni valore nella riga un "1" nella colonna corrispondente.

Se uso

> table(sequence(length(x)),t(x)) 

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
    1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    3 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
    4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 
    5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    6 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
    7 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
    8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
    9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    10 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 
    11 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
    12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 
    13 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    14 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 
    15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
    17 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    18 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
    19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
    20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 

questo è vicino a quello che sto cercando, ma restituisce una riga per ogni valore.

Avrei solo bisogno di consolidare tutti i valori da una riga in una riga. Perché un

> table(x) 
x 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

dà valori alls di tutto il tavolo, in modo che cosa devo fare per ottenere i valori per riga.

+1

E se ci sono due interi uguali nella stessa riga? – Julius

+0

Questo non è il caso. –

risposta

4

Ecco un'altra opzione utilizzando la funzione table():

table(row(x), x) 
# x 
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
# 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
# 2 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 
# 3 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 
# 4 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 
# 5 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 
4
bit_x = matrix(0, nrow = nrow(x), ncol = max(x)) 
    for (i in 1:nrow(x)) {bit_x[i,x[i,]] = 1} 
4

Let

(x <- matrix(c(1, 3), 2, 2)) 
    [,1] [,2] 
[1,] 1 1 
[2,] 3 3 

Un approccio potrebbe essere

M <- matrix(0, nrow(x), max(x)) 
M[cbind(c(row(x)), c(x))] <- 1 
M 
#  [,1] [,2] [,3] 
# [1,] 1 0 0 
# [2,] 0 0 1 

In una sola riga:

replace(matrix(0, nrow(x), max(x)), cbind(c(row(x)), c(x)), 1). 

Seguendo il vostro approccio, e in modo simile a @ di Psidom suggerimento:

01.235.
table(rep(1:nrow(x), ncol(x)), x) 
# x 
#  1 3 
# 1 2 0 
# 2 0 2 
3

possiamo usare il pacchetto reshape2.

library(reshape2) 
# At first we make the matrix you provided 
x <- matrix(1:20, 5, 4) 
# then melt it based on first column 
da <- melt(x, id.var = 1) 
# then cast it 
dat <- dcast(da, Var1 ~ value, fill = 0, fun.aggregate = length) 

che ci dà questa

Var1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 
2 2 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 
3 3 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 
4 4 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 
5 5 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1