【问题标题】:convert csv file to matrix in R将csv文件转换为R中的矩阵
【发布时间】:2017-08-24 18:26:50
【问题描述】:

我有一个 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

【问题讨论】:

  • 随便xtabs(Total ~User_name + M_User, df)
  • 礼貌地说,您的输出应该是矩阵的样子(如您在此处看到的 [1]:stats.idre.ucla.edu/r/library/…)。您能否告诉我们更多关于您的输出目标的信息,以便我们更好地提供一些指导?例如,是否有理由需要它成为矩阵?你实际上对输出做了什么?
  • 您可以使用 read.csv 将 csv 文件作为矩阵读取。阅读此package documentation
  • @Masoud 这里的问题不仅与对象的类别有关,还与交叉制表有关。在链接的问题中,它仅与课程有关。

标签: r csv matrix


【解决方案1】:

我们可以使用来自base Rxtabs 来做到这一点

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 来自 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

数据

df <- structure(list(User_name = structure(c(1L, 1L, 1L, 3L, 2L), .Label = c("user 1", 
"user 2", "user 3", "user 7"), class = "factor"), M_User = structure(c(2L, 
3L, 4L, 2L, 4L), .Label = c("user 1", "user 2", "user 3", "user 7"
), class = "factor"), Total = c(7L, 19L, 5L, 1L, 1L)), .Names = c("User_name", 
"M_User", "Total"), row.names = c(NA, -5L), class = "data.frame")

【讨论】:

  • 这在我像你一样输入数据时有效,但是当我从 csv 文件中读取时,输出与我原来的帖子中提到的相同:/
  • 'df
  • @melissa 你能查一下str(df)
  • ok str(df) 显示您的数据有 4 个级别,而我的 csv 文件仅显示 3 个级别:/
  • @melissa 它只显示一列吗?在这种情况下,您的 sep 有问题
【解决方案2】:

使用tidyr::spread函数如下:

require(tidyr)
df %>% spread(key=M_User,value = Total,fill = 0) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2017-03-22
    • 2020-08-09
    • 2013-02-12
    相关资源
    最近更新 更多