2016-07-14 181 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