【问题标题】:How to create matrix from list in r如何从r中的列表创建矩阵
【发布时间】:2014-10-28 03:58:00
【问题描述】:

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

    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        ....

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

【问题讨论】:

  • 除了下面的好答案,一个基本的R解决方案reshape(df, idvar = "User_ID", timevar = "Test" , direction = "wide")

标签: r list matrix


【解决方案1】:

你可以试试

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

【讨论】:

  • 我认为您不需要将矩阵类分配给xtabs 创建的表对象。表对象继承自矩阵。
  • 感谢您的解决方案,第一个解决方案适合我的数据。尽管我的第一个问题可能会让您感到讨厌,但您为我节省了很多时间,再次感谢您:)
【解决方案2】:

从基础包,你可以试试

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

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 2012-11-25
    • 2015-07-12
    • 2020-11-24
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多