【问题标题】:Reshape row into column of the 2d array in a matrix in R在R中的矩阵中将行重塑为二维数组的列
【发布时间】:2023-04-01 03:43:01
【问题描述】:

考虑以下矩阵:

M <- cbind(c("ID001", "ID003", "ID002", "ID002", "ID003"),
           c("BK101", "BK145", "BK101", "BK125", "BK101"), 
           c(6, 3, 2, 7, 3))

我想重塑矩阵,所以得到如下矩阵:

       BK101 BK125 BK145
ID001    6     0     0
ID002    2     7     0
ID003    3     0     3

我试过了:

reshape(M, idvar=[,1], timevar=[,2])

但这不起作用。

【问题讨论】:

标签: r matrix reshape


【解决方案1】:

如果您命名列并将它们放入数据框中:

M <- data.frame("a"=c("ID001","ID003","ID002","ID002","ID003"),
                "b"=c("BK101","BK145","BK101","BK125","BK101"),
                "c"=c(6,3,2,7,3))
xtabs(c~a+b,data=M)

       b
a       BK101 BK125 BK145
  ID001     6     0     0
  ID002     2     7     0
  ID003     3     0     3

【讨论】:

  • as.data.frame(unclass(xtabs(as.numeric(as.character(V3)) ~ V1 + V2, data=as.data.frame(M))))(注:OP 的M)。
  • 谢谢。这是完美的,jay.sf :-)
【解决方案2】:

创建矩阵时的一般模式:

首先创建一个用于存储结果的空矩阵。

X <- matrix(0, nrow=length(unique(M[,1])), ncol=length(unique(M[,2])),
            dimnames=list(sort(unique(M[,1])), sort(unique(M[,2]))))


X
      BK101 BK125 BK145
ID001     0     0     0
ID002     0     0     0
ID003     0     0     0

然后添加数据。

X[M[,1:2]] <- as.numeric(M[,3])

X
      BK101 BK125 BK145
ID001     6     0     0
ID002     2     7     0
ID003     3     0     3

【讨论】:

  • 这很可能是因为您的Mdata.frame 而不是matrix,如答案所示。尝试将最后一行更改为x[as.matrix(M[,1:2])] &lt;- as.numeric(M[,3])
【解决方案3】:

dcast 的另一个选项

library(reshape2)
dcast(M, a~b, fill = 0)
#      a BK101 BK125 BK145
#1 ID001     6     0     0
#2 ID002     2     7     0
#3 ID003     3     0     3

或与pivot_wider 来自tidyr

library(dplyr)
library(tidyr)
 M %>%
     pivot_wider(names_from = b, values_from = c, values_fill = list(c = 0))
# A tibble: 3 x 4
#  a     BK101 BK145 BK125
#  <fct> <dbl> <dbl> <dbl>
#1 ID001     6     0     0
#2 ID003     3     3     0
#3 ID002     2     0     7

数据

M <- data.frame("a"=c("ID001","ID003","ID002","ID002","ID003"),
                "b"=c("BK101","BK145","BK101","BK125","BK101"),
                "c"=c(6,3,2,7,3))

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2013-05-17
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多