根据另一个索引矩阵递增一个矩阵
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
我有一个矩阵:
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