我有一个csv文件
User_name M_User Total
user 1 user 2 7
user 1 user 3 19
user 1 user 7 5
user 3 user 2 1
user 2 user 7 1
我希望以矩阵形式转换它
user 1 user 2 user 3 user 7
user 1 0 7 19 5
user 3 0 1 0 0
user 2 0 0 0 1
user 7 0 0 0 0
我现在正在做的事情是这样的
require(reshape2)
m <- as.matrix(dcast(df, USER_NAME ~ M_USER, value.var = "TOTAL", fill=0))[,1:4]
但我得到的答案是
USER_NAME user 2 user 3 user 7
[1,] "user 1" "7" "19" "5"
[2,] "user 2" "0" " 0" "1"
[3,] "user 3" "1" " 0" "0"
如何修改代码以便获得此矩阵
user 1 user 2 user 3 user 7
user 1 0 7 19 5
user 3 0 1 0 0
user 2 0 0 0 1
user 7 0 0 0 0
答案 0 :(得分:0)
我们可以使用xtabs
base R
执行此操作
xtabs(Total ~User_name + M_User, df, drop = FALSE)
# M_User
#User_name user 1 user 2 user 3 user 7
# user 1 0 7 19 5
# user 2 0 0 0 1
# user 3 0 1 0 0
# user 7 0 0 0 0
此外,来自acast
的{{1}}可提供reshape2
输出
matrix
library(reshape2)
acast(df, User_name ~ M_User, value.var = "Total", fill=0, drop = FALSE)
# user 1 user 2 user 3 user 7
#user 1 0 7 19 5
#user 2 0 0 0 1
#user 3 0 1 0 0
#user 7 0 0 0 0
答案 1 :(得分:0)
使用tidyr::spread
功能如下:
require(tidyr)
df %>% spread(key=M_User,value = Total,fill = 0)