在R中的矩阵中添加计数

在R中的矩阵中添加计数,r,matrix,vector,R,Matrix,Vector,我的问题是,在一个循环中,每个i-一个像这样输出的矩阵 structure(c(8L, 4L, 3L, 4L, 1L, 8L, 28L, 32L, 24L, 32L, 8L, 64L, 0L, 6L, 12L, 16L, 4L, 32L, 0L, 0L, 3L, 12L, 3L, 24L, 0L, 0L, 0L, 6L, 4L, 32L, 0L, 0L, 0L, 0L, 0L, 8L, 0L, 0L, 0L, 0L, 0L, 28L), .Dim = 6:7, .Dimnames = st

我的问题是,在一个循环中,每个i-一个像这样输出的矩阵

structure(c(8L, 4L, 3L, 4L, 1L, 8L, 28L, 32L, 24L, 32L, 8L, 64L, 
0L, 6L, 12L, 16L, 4L, 32L, 0L, 0L, 3L, 12L, 3L, 24L, 0L, 0L, 
0L, 6L, 4L, 32L, 0L, 0L, 0L, 0L, 0L, 8L, 0L, 0L, 0L, 0L, 0L, 
28L), .Dim = 6:7, .Dimnames = structure(list(c("ESN", "GWD", 
"LWK", "MSL", "PEL", "YRI"), c("ACB", "ESN", "GWD", "LWK", "MSL", 
"PEL", "YRI")), .Names = c("", "")), class = "table")
此矩阵按比例共享计数-这些计数现在应添加到一个更大的表中-比此表中仅显示的7个级别更多。它总是一个对称矩阵(因此上三角形)可以忽略

实表(其所有元素在开始时均为0)

然后还应将其添加到matr中-如果某个字段以前有一个数字,则应将这两个数字相加


感谢

考虑到通过迭代创建的每个“表”中的重复/不相等/非零条目,并仅更新“matr”的
下.tri

其中“tabs”是一个“列表”,包含迭代创建的“表”:

“mat”是一个较小的“matr”:


分配时,您将需要:;i、 e.在每个步骤中(创建了表“tab”),您都希望通过添加“tab”来更新“matr”的
cbind(rownames(tab)[row(tab)]、colnames(tab)[col col(tab)])
索引。@alexi_laz-但是如何只添加到下对角线?因此,如果在对角线上方添加一个计数,那么它必须(移动)到对角线下方……除非我遗漏了什么,否则在使用所有“制表符”进行更新之后,
matr+t(matr)
之类的东西会更新下方的三角形吗?然后,将0添加到
upper.tri
@alexis_laz抱歉-我不确定您是否介意更详细地说明一下,请像我可以接受的回答一样-为什么您要t()它?您的示例中的两个“表”都不是对称的,而且都有不同值的重复条目-例如,在第一个表
[“ESN”、“GWD”]!=[“GWD”、“ESN”]
和第二个
[“IBS”、“MXL”]!=[“MXL”、“IBS”]
。在重复条目中,是否始终存在一个
==0
和一个
!=0
,或者两者都可以
!=0
,并且在“matr”中,它们的总和应该相加?并且是您的“表格”吗“s,的确是非对称的?但是mat是什么?它是如何从mat中产生的?@kutyw:我用上面的“mat”和“tabs”作为一个更简单/更广泛的例子;将“mat”替换为“matr”,并将“TAB”替换为问题中包含的两个“表”的“列表”
dput
,然后运行上述操作,应得到想要的/更新的“matr”
matr<-matrix(0,nrow=26,ncol=26)
pop<-c("CHB","JPT","CHS","CDX","KHV","CEU","TSI","FIN","GBR","IBS","YRI","LWK","GWD","MSL","ESN","ASW","ACB","MXL","PUR","CLM","PEL","GIH","PJL","BEB","STU","ITU")

rownames(matr)<-pop
colnames(matr)<-pop
structure(c(1L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L), .Dim = c(3L, 
3L), .Dimnames = structure(list(c("IBS", "MXL", "TSI"), c("GBR", 
"IBS", "MXL")), .Names = c("", "")), class = "table")
for(tab in tabs) {
     ## if each 'tab' is large enough, 
     ## instead of creating (and subsetting with) 'row(tab)' and 'col(tab)'
     ##, a 'rep(, each = )' could be used
     i = match(rownames(tab), rownames(mat))[row(tab)]
     j = match(colnames(tab), colnames(mat))[col(tab)]

     ## to fill only the 'lower.tri'
     ii = pmax(i, j); jj = pmin(i, j)

     ## sum duplicate entries 'tab' with 'sparseMatrix's intrinsic 'xtabs'-like behaviour
     ijx = summary(sparseMatrix(ii, jj, x = c(tab)))

     ## subset and assign with a matrix index updating previous entries
     ij = cbind(ijx$i, ijx$j)
     mat[ij] = mat[ij] + ijx$x
}
mat
#  a  b c d e
#a 0  0 0 0 0
#b 4  1 0 0 0
#c 6  7 2 0 0
#d 5 12 5 7 0
#e 4  6 3 3 0
set.seed(007)            
tabs = replicate(3, table(replicate(2, 
                                    sample(letters[1:5], 50, TRUE), simplify = FALSE))[
                                        sample(5, sample(2:5, 1)), sample(5, sample(2:5, 1))], 
                 simplify = FALSE)
mat = matrix(0L, 5, 5, dimnames = replicate(2, letters[1:5], simplify = FALSE))