我有一个由邻接列表组成的列表,数据看起来像这样
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 ....
如何将此列表转换为矩阵?
答案 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)