R通过矩阵行来创建表格

16

如何生成一个表格,其中行数与矩阵的行数相等?(针对 as.matrix)

>table(matrix)

>hist(matrix)

对于矩阵中的每个唯一数据值,显示其累加和,但我希望有一个表格,其中行与每个矩阵行相同的值,表格列是矩阵中每个唯一数据值的出现次数之和。

示例矩阵:

   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      

期望的输出表格:

   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
有两个比我的更高效和优雅。您可能希望考虑取消对我的答案的勾选,并将其放在其他答案之一上(例如@GregoryDemin的)。 - Ricardo Saporta
4个回答

10

一种替代方法是将您的矩阵转换为长数据框(使用stack),此时您可以轻松使用table

这是您的数据:

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")))

这是一个长格式的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

这里是如何使用它来创建您想要的表格:
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

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

4

我也使用了apply

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

2

您可以在行上使用apply函数,然后使用带有ifelse语句的mapply函数来获取矩阵。

假设X是您的矩阵:

# 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接