R table by matrix row
One alternative is to convert your matrix
to a long data.frame
(using stack
), at which point you can easily use table
:
Here's your data:
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")))
This is what it looks like as a long 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
Here's how we can use that to create the table you want:
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
I used apply
too:
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 1R > 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