【问题标题】:Turning a wide-form matrix into long-form in R (possibly with reshape2 and melt) [duplicate]在R中将宽格式矩阵转换为长格式(可能使用reshape2和melt)[重复]
【发布时间】:2016-02-02 00:40:39
【问题描述】:

我有一个矩阵,它(结构上)看起来像这样:

     id            1st         2nd          3rd        4th         5th
[1,] "aaaaa1"      "Tesco"     "Sainsbury"  "M&S"      "Waitrose"  "Asda"
[2,] "bbbbb2"      "Sainsbury" "Tesco"      "Waitrose" "Asda"      "M&S"

我需要把它变成:

     id            shop
[1,] "aaaaa1"      "Tesco"
[2,] "aaaaa1"      "Sainsbury"
[3,] "aaaaa1"      "M&S"
[4,] "aaaaa1"      "Waitrose"
[5,] "aaaaa1"      "Asda"
[6,] "bbbbb2"      "Sainsbury"
[7,] "bbbbb2"      "Tesco" (ETC.)

我一辈子都想不出一个不涉及循环的简单解决方案,但我知道它应该很简单。

我尝试了以下方法,但它根本不起作用:

library(reshape2)
meltedPredictionsMatrix = melt(widePredictionsMatrix, id.vars="id")

我觉得可能有一个更直接的解决方案,不需要包,但我被卡住了。

【问题讨论】:

  • 使用reshape - reshape(data.frame(dat), idvar="id", direction="long", varying=-1, v.names="shop", timevar=NULL)

标签: r reshape reshape2


【解决方案1】:

如果预期输出是matrix,则cbind 初始矩阵的第一列(复制后)与其他列,然后order 第一列(base R 选项)。

 res <- cbind(id= m1[,1][row(m1[,-1])], shop=c(m1[,-1]))
 res[order(res[,1]),]
 #      id       shop       
 #[1,] "aaaaa1" "Tesco"    
 #[2,] "aaaaa1" "Sainsbury"
 #[3,] "aaaaa1" "M&S"      
 #[4,] "aaaaa1" "Waitrose" 
 #[5,] "aaaaa1" "Asda"     
 #[6,] "bbbbb2" "Sainsbury"
 #[7,] "bbbbb2" "Tesco"    
 #[8,] "bbbbb2" "Waitrose" 
 #[9,] "bbbbb2" "Asda"     
 #[10,] "bbbbb2" "M&S"      

如果我们想要一个data.frame作为输出,melt可以在转换成data.frame后使用

library(reshape2)
 melt(as.data.frame(m1), id.var='id')[-2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2023-02-25
    相关资源
    最近更新 更多