Подсчет частоты символов путем присвоения другой матрицы - PullRequest
3 голосов
/ 20 апреля 2020

У меня есть две матрицы: «основная» и «метка».

> main
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    2    0    1    2    1    1    0     1
 [2,]    0    0    1    0    1    2    2    1    2     1
 [3,]    0    0    0    1    2    0    2    0    2     0
 [4,]    0    0    0    0    2    1    0    2    1     0
 [5,]    0    0    0    0    0    2    1    0    1     2
 [6,]    0    0    0    0    0    0    2    0    1     2
 [7,]    0    0    0    0    0    0    0    0    1     1
 [8,]    0    0    0    0    0    0    0    0    0     1
 [9,]    0    0    0    0    0    0    0    0    0     0
[10,]    0    0    0    0    0    0    0    0    0     0

> label
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] "0"  "0"  "G"  "0"  "C"  "G"  "F"  "E"  "0"  "A"  
 [2,] "0"  "0"  "B"  "0"  "D"  "D"  "F"  "G"  "E"  "D"  
 [3,] "0"  "0"  "0"  "E"  "G"  "0"  "D"  "0"  "A"  "0"  
 [4,] "0"  "0"  "0"  "0"  "A"  "D"  "0"  "F"  "E"  "0"  
 [5,] "0"  "0"  "0"  "0"  "0"  "C"  "H"  "0"  "F"  "G"  
 [6,] "0"  "0"  "0"  "0"  "0"  "0"  "F"  "0"  "B"  "F"  
 [7,] "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "F"  "E"  
 [8,] "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "D"  
 [9,] "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  
[10,] "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  "0"  

Выбирая каждый символ в матрице «метка», я хочу получить общее количество позиций этого символ в «основной» матрице. например, если я задаю «B», результат должен быть равен 2 (сумма чисел в «основной» матрице, которые находятся в позиции B), или, давая «A», мы должны получить 5. Это означает, что мы будем иметь список различных видов меток с частотой каждой метки в основной матрице. как:

A  B  ...
5  2  ...

Ответы [ 3 ]

5 голосов
/ 20 апреля 2020

Может быть, вы можете попробовать xtabs или tapply

res <- xtabs(data.frame(c(main),c(label)))

или

res <- tapply(main,label,sum)

Пример

set.seed(1)
main <- matrix(sample(0:2,25,replace = TRUE),nrow = 5)
label <- matrix(sample(c("0",LETTERS[1:3]),25,replace = TRUE),nrow = 5)

res <- xtabs(data.frame(c(main),c(label)))

такой что

> res
c.label.
0 A B C 
6 7 2 6 
3 голосов
/ 20 апреля 2020

Если data.frame - ожидаемый формат для результата, как насчет aggregate

aggregate(main ~ label ,data.frame(main = c(main),label = c(label)),sum)
2 голосов
/ 20 апреля 2020

Использование Matrix.utils пакет:

library(Matrix.utils)

aggregate.Matrix(c(main), c(label), fun = "sum")

С @ данными ThomasIsCoding :

4 x 1 sparse Matrix of class "dgCMatrix"

0 6
A 7
B 2
C 6
...