2013-04-28 22 views
10

Per una matrice (as.matrix), come è possibile generare una tabella in cui le righe sono uguali alle righe della matrice?tabella R per riga matrice

>table(matrix) 

e

>hist(matrix) 

mostrano la somma cumulativa per ogni valore di dati univoco nella matrice, ma vorrei una tabella in cui le righe sono lo stesso valore di ogni riga della matrice, e colonne della tabella sono la somma di ciascun valore di dati univoco nella matrice.

matrice Esempio:

1 2 3 4 
a 5 5 4 6  
b 5 5 5 5  
c 8 7 6 6 
d 2 6 6 6  
e 7 7 5 4  

desiderata tabella di output:

2 4 5 6 7 8 
a 0 1 2 1 0 0 
b 0 0 4 0 0 0 
c 0 0 0 2 1 1 
d 1 0 0 3 0 0 
e 0 1 1 0 2 0 
+1

ci sono due molto più efficiente ed elegante del mio. Potresti considerare di rimuovere il segno di spunta dalla mia risposta e posizionarlo invece su uno degli altri (ad esempio @GregoryDemin's) –

risposta

8

Un'alternativa è quella di convertire il vostro matrix per un lungo data.frame (usando stack), a questo punto si può utilizzare facilmente table:

Ecco i vostri dati:

mymat <- structure(c(5L, 5L, 8L, 2L, 7L, 5L, 5L, 7L, 6L, 7L, 4L, 5L, 6L, 
      6L, 5L, 6L, 5L, 6L, 6L, 4L), .Dim = c(5L, 4L), .Dimnames = list(
       c("a", "b", "c", "d", "e"), c("1", "2", "3", "4"))) 

Questo è quello che sembra come un lungo data.frame:

head(stack(data.frame(t(mymat)))) 
# values ind 
# 1  5 a 
# 2  5 a 
# 3  4 a 
# 4  6 a 
# 5  5 b 
# 6  5 b 

Ecco come possiamo utilizzare che per creare la tabella che si desidera:

with(stack(data.frame(t(mymat))), table(ind, values)) 
# values 
# ind 2 4 5 6 7 8 
# a 0 1 2 1 0 0 
# b 0 0 4 0 0 0 
# c 0 0 0 2 1 1 
# d 1 0 0 3 0 0 
# e 0 1 1 0 2 0 
+1

molto bello! Questa soluzione mi piace molto più di quella che ho proposto –

2

è possibile utilizzare apply sopra le righe, e quindi utilizzare mapply con una ifelse dichiarazione per ottenere indietro il vostro matrice.

Supponendo X è la vostra matrice:

# this will get you the values, just not in a nice matrix 
tables.list <- apply(X, 1, table) 

# unique values 
vals <- sort(unique(c(X))) 

# this will get you the matrix 
results <- t(mapply(function(v, t) 
    ifelse(v %in% names(t), t[as.character(v)], 0), list(vals), tables.list)) 

# give it names 
dimnames(results) <- list(rownames(X), vals) 

results 

# 2 4 5 6 7 8 
# a 0 1 2 1 0 0 
# b 0 0 4 0 0 0 
# c 0 0 0 2 1 1 
# d 1 0 0 3 0 0 
# e 0 1 1 0 2 0 
+0

Grazie mille, questo è stato estremamente utile! – TallTree

+0

@TallTree, nessun problema. felice di aiutare –

3

ho usato apply troppo:

t(apply(mat, 1, function(x) table(factor(x, levels = unique(sort(c(mat))))))) 

R > mat = matrix(sample(1:8, 20, replace = T), 5, 4) 
R > mat 
    [,1] [,2] [,3] [,4] 
[1,] 5 6 1 4 
[2,] 4 3 4 8 
[3,] 4 8 4 3 
[4,] 3 3 5 1 
[5,] 1 1 3 1 
R > t(apply(mat, 1, function(x) table(factor(x, levels = unique(sort(c(mat))))))) 
    1 3 4 5 6 8 
[1,] 1 0 1 1 1 0 
[2,] 0 1 2 0 0 1 
[3,] 0 1 2 0 0 1 
[4,] 1 2 0 1 0 0 
[5,] 3 1 0 0 0 0 
7
## source data 
x=as.matrix(read.table(text=" 
    1 2 3 4 
a 5 5 4 6  
b 5 5 5 5  
c 8 7 6 6 
d 2 6 6 6  
e 7 7 5 4 
")) 

# result 

table(rep(rownames(x),ncol(x)),c(x)) 

# 2 4 5 6 7 8 
# a 0 1 2 1 0 0 
# b 0 0 4 0 0 0 
# c 0 0 0 2 1 1 
# d 1 0 0 3 0 0 
# e 0 1 1 0 2 0 
+0

+1 molto bello. Non ovvio, ma molto elegante. –

+0

wow, davvero elegante. +1! –

Problemi correlati