【问题标题】:Adding counts in matrix in R在R中的矩阵中添加计数
【发布时间】:2016-09-30 13:06:43
【问题描述】:

我的问题是在每个 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")

此矩阵计算 pariwise 共享 - 这些计数现在应该添加到一个更大的表中 - 具有比此表中仅存在的 7 个更多的级别。它总是一个对称矩阵(所以上三角)可以忽略

真正的表(所有元素在开头都是0)

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

谁能告诉我如何以有效的方式将这些计数从小表添加到大表(在正确的字段中)?我需要更新表 100k 时间 - 所以效果会很好。如前所述,添加下三角形很好....

EDI #####

所以另一个数据集 - 可能看起来像(然后从循环的下一次迭代中生成)

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")

这也应该被添加到 matr - 如果一个字段之前有一个数字,这两个数字应该相加

谢谢

【问题讨论】:

  • 分配时需要matrix-indexing;即在每个步骤中(已创建一个表“tab”),您需要通过添加“tab”来更新“matr”的cbind(rownames(tab)[row(tab)], colnames(tab)[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”中应该添加它们的总和?你的“桌子”真的是不对称的吗?

标签: r matrix vector


【解决方案1】:

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

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

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

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”是一个较小的“matr”:

mat = matrix(0L, 5, 5, dimnames = replicate(2, letters[1:5], simplify = FALSE))

【讨论】:

  • 但是什么是垫子——垫子是怎么来的?
  • @kutyw :我使用上面的“mat”和“tabs”作为更简单/广泛的示例;用你的问题中包含的两个“表”dput 的“列表”替换“matr”和“tabs”并运行上述内容,应该会导致想要/更新的“matr”
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多