根据另一个索引矩阵递增一个矩阵

Increment a matrix based on another matrix of indices

我有一个矩阵:

a <- matrix(0,nrow=26,ncol=26)
tags <- sample(letters)
colnames(a) <- tags
rownames(a) <- tags

和另一个矩阵:

b <- matrix(c(1,2,1,2,1,2,3,5,5,5),nrow=5,ncol=2)

我想递增 a 中的所有单元格,其索引在 b

的每一行中指定

这会引起以下变化:

a[b[1,1],b[1,2]] <- a[b[1,1],b[1,2]] +1
a[b[2,1],b[2,2]] <- a[b[2,1],b[2,2]] +1
...

我正在寻找一种有效的解决方案,最好是不涉及循环的解决方案

你可以试试这个:

library(dplyr)
countB <- data.frame(b) %>% group_by(X1, X2) %>% summarise(Count = n())
a[as.matrix(countB[-3])] <- countB[[3]]

我们可以使用 ave 来自 base R

v1 <- ave(seq_len(nrow(b)), b[,1], b[,2], FUN = length)
i1 <- !duplicated(b)

a[b[i1,]] <- v1[i1]

您可以使用 dplyr 中的 count 函数:

library(plyr)
cnt <- as.matrix(count(b,c(1,2)))
     # x.1 x.2 freq
# [1,]   1   2    1
# [2,]   1   5    2
# [3,]   2   3    1
# [4,]   2   5    1

a[cnt[,1:2]] <- cnt[,3]

或使用基数 R 计算计数:

cnt <- as.data.frame(as.table(table(as.data.frame(b))))

  # V1 V2 Freq
# 1  1  2    1
# 2  2  2    0
# 3  1  3    0
# 4  2  3    1
# 5  1  5    2
# 6  2  5    1