Изменить форму строки в столбце 2-го массива в матрице в R - PullRequest
2 голосов
/ 04 октября 2019

Рассмотрим следующую матрицу:

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])

Но это не работает.

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Общий шаблон при создании матрицы:

Сначала создайте пустую матрицу, в которой вы будете хранить свои результаты.

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
2 голосов
/ 04 октября 2019

Если вы назовете свои столбцы и поместите их во фрейм данных:

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
1 голос
/ 04 октября 2019

Другой вариант с 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))
...