2016-07-14 141 views
0

我有一个矩阵:增量基于指数的另一个矩阵的矩阵

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 
... 

我在寻找一个有效的解决方案最好一个不涉及循环

+1

顺便说一句,如果你使用-indeed-稀疏矩阵,可以考虑,另外,像'矩阵::稀疏矩阵(I = B [,1 ],j = b [,2],x = 1L,dims = c(26,26),dimnames = list(tags,tags))' –

回答

1

你可以试试这个:

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

对于重复索引,这不会增加一次以上。注意矩阵b包含三次索引(1,2),我期望一个[1,2]是3,而不是1 – Imlerith

+0

我认为如果在分配数据之前聚合数据可能会更方便一些?像计算相同指数的发生一样。 – Psidom

+0

作为一个方面说明,矩阵b是由列填充的,所以你不会真的有(1,2)三次,但(1,5)两次。如果你想逐行填写,你可以指定'byrow'参数为true。 – Psidom

0

我们可以使用avebase R

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

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

你可以使用dplyrcount功能:

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