R суммируют матрицы с разными размерами в списке и возвращают матрицу - PullRequest
0 голосов
/ 02 мая 2020

Это может быть легко, но я не могу понять это. У меня есть список, который состоит из матриц:

randomString <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}

mat_names <- randomString(10)

mat1 <- matrix(sample(1:100, 10), nrow = 1, ncol = 10)
colnames(mat1) <- mat_names[1:10]

mat2 <- matrix(sample(1:100, 7), nrow = 1, ncol = 7)
colnames(mat2) <- mat_names[1:7]

mat3 <- matrix(sample(1:100, 3), nrow = 1, ncol = 3)
colnames(mat3) <- mat_names[1:3]

matlist <- list(
  "mat1"=mat1,
  "mat2"=mat2,
  "mat3"=mat3
)
print(matlist)

Вывод:

$mat1
     YDBTT5207K DJTTX5635J XADWJ8211U SPPLC7331C DKSHW5279Z VSTXA0199O RELXP9721L SQQFH3616Q JFZFB3125N NWKCT9607I
[1,]         93         72         92         94         74         91         11         15         63         55

$mat2
     YDBTT5207K DJTTX5635J XADWJ8211U SPPLC7331C DKSHW5279Z VSTXA0199O RELXP9721L
[1,]         53         84         18         44         79         47        100

$mat3
     YDBTT5207K DJTTX5635J XADWJ8211U
[1,]         88         49         36

Теперь я хочу, чтобы сумма столбцов основывалась на их именах, поэтому такая матрица:

     YDBTT5207K DJTTX5635J XADWJ8211U SPPLC7331C DKSHW5279Z VSTXA0199O RELXP9721L SQQFH3616Q JFZFB3125N NWKCT9607I
[1,]        234        205        146        138        153        138        111         15         63         55

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Может быть так:

allelem = Reduce(union,lapply(matlist,colnames))
unionMat = sapply(matlist,function(i)i[,match(allelem,colnames(i))])

           mat1 mat2 mat3
REBQG1509K   42    1   20
IHZKK6973T   24   10   89
XRSXL1970Q   30    9   88
UNGOW7172K   47    6   NA
RKJFP9148P   61   90   NA
YRVEA1199Q   74   11   NA
SBAUE6979O   23   20   NA
JRVKW2279O   84   NA   NA
SSTEO2503H    1   NA   NA
LEKKI1679Y   58   NA   NA

rowSums(unionMat,na.rm=TRUE)
REBQG1509K IHZKK6973T XRSXL1970Q UNGOW7172K RKJFP9148P YRVEA1199Q SBAUE6979O 
        63        123        127         53        151         85         43 
JRVKW2279O SSTEO2503H LEKKI1679Y 
        84          1         58
1 голос
/ 02 мая 2020

Я подозреваю, что есть несколько разных способов подойти к этому. Один из возможных способов - создать фрейм данных из вашего списка, который будет объединять значения из одинаковых имен. Недостающие элементы для данного имени будут NA. Затем вычислите суммы с помощью colSums и покажите результат в виде транспонированной матрицы.

library(dplyr)

bind_rows(lapply(matlist, as.data.frame)) %>%
  colSums(na.rm = TRUE) %>%
  as.matrix() %>%
  t()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...