如何从r中的列表创建矩阵

时间:2014-10-28 03:58:00

标签: r list matrix

我有一个由邻接列表组成的列表,数据看起来像这样

    Test User_ID hardest
1   77      A       5
2   77      B       4
3   77      C       4
4   78      A       4
5   78      B       5
6   78      C       4
7   79      A       5
8   79      B       4  ...

我想制作一个像列一样的矩阵,由测试编号组成,行由用户ID组成 矩阵中的单元格最难,看起来如下

   77   78   79
A   5    4    5 
B   4    5    4
C   4    4        ....

如何将此列表转换为矩阵?

2 个答案:

答案 0 :(得分:3)

你可以尝试

library(reshape2)
 dcast(df, User_ID~Test, value.var='hardest')
 #   User_ID 77 78 79
 #1       A  5  4  5
 #2       B  4  5  4
 #3       C  4  4 NA

如果是你想要的矩阵

 acast(df, User_ID~Test, value.var='hardest')
 #   77 78 79
 #A  5  4  5
 #B  4  5  4
 #C  4  4 NA

tidyr

 library(tidyr)
 spread(df, Test, hardest)
 #    User_ID 77 78 79
 #1       A  5  4  5
 #2       B  4  5  4
 #3       C  4  4 NA

或使用xtabs

x1 <- xtabs(hardest~User_ID+Test, df)
attr(x1, "call") <- NULL
attr(x1, "class") <- NULL
dimnames(x1) <- unname(dimnames(x1))
x1
#  77 78 79
#A  5  4  5
#B  4  5  4
#C  4  4  0

数据

df <- structure(list(Test = c(77L, 77L, 77L, 78L, 78L, 78L, 79L, 79L
), User_ID = c("A", "B", "C", "A", "B", "C", "A", "B"), hardest = c(5L, 
4L, 4L, 4L, 5L, 4L, 5L, 4L)), .Names = c("Test", "User_ID", "hardest"
), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
"6", "7", "8"))

答案 1 :(得分:2)

从基础套餐中,您可以尝试

tapply(df$hardest,df[,c("User_ID","Test")],sum)