【问题标题】:R - Divide each value in matrix by maximum value of its row/columnR - 将矩阵中的每个值除以其行/列的最大值
【发布时间】:2014-04-06 16:04:33
【问题描述】:

我试图通过将每个值除以其列名或行名的最大值中的较小者来转换矩阵中的值。我遇到了麻烦,因为我不知道如何从更大的函数内部查询特定值的行/列。

数据的一小部分如下所示:加权(对称)邻接矩阵,mat:

              Acousmatic Acoustic Afro-beat Alternative Ambient
  Acousmatic         125       11         3           3       1
  Acoustic            11   112398      1810       24216    3824
  Afro-beat            3     1810     10386        1220     298
  Alternative          3    24216      1220      103286    2838
  Ambient              1     3824       298        2838   20400

作为一个例子,我想通过找到由其对角线 (112398) 给出的“Acoustic”的最大值和由其对角线给出的“Alternative”的最大值来转换“Alternative-Acoustic”(24216) 的值(103286),并通过将“Alternative-Acoustic”(24216)除以这两个数字中的较小者。所以在这种情况下,较小的将是“Alternative”,所以我想将“Alternative-Acoustic”值转换为 24216/103286=~.2345。

我想对该矩阵中的所有值自动执行此转换,这将产生一个值范围为 0-1 且对角线全为 1 的矩阵。

我在许多不同的迭代中尝试了以下操作,“mat”既作为矩阵又作为数据框,但我不知道如何正确查询矩阵中每个值的行和列最大值。这是使用不存在的函数('colmax' 和 'rowmax'),但我认为它最清楚地表达了我想要做的事情:

transformedmat

我也尝试过写一个嵌入式函数,但结果很糟糕,我想知道是否有更简单的解决方案:

rescalemat <- function(mat){
    apply(mat, 1, function(x){
    colmax<-apply(mat, 2, function(x) max(x))
    rowmax<-apply(mat, 1, function(x) max(x))
    x/min(colmax,rowmax)
    mat
})
}

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 您应该记住,您在尝试中使用的表达式 min(colmax,rowmax) 是一个数字。你真正想要的是一个入口最小化,这可以通过 ifelse 构造来实现

标签: database r matrix rows


【解决方案1】:

试试这个:

A1 = mat/apply(mat,1,max)
A2 = t(t(mat)/apply(mat,2,max))
result = ifelse(A1>A2,A1,A2)

【讨论】:

  • 啊,把它分成两个更简单的操作/矩阵,然后取两者中较大的值。好多了。杰出的。非常感谢!
  • 最后一步可以是pmax(A1, A2)。
【解决方案2】:

除非我错过了什么,否则这种方法看起来也很有效:

res = diag(mat)
#names(res) = colnames(mat)       
mat / outer(res, res, pmin) 

#            Acousmatic  Acoustic  Afro.beat Alternative    Ambient
#Acousmatic       1.000 0.0880000 0.02400000   0.0240000 0.00800000
#Acoustic         0.088 1.0000000 0.17427306   0.2344558 0.18745098
#Afro-beat        0.024 0.1742731 1.00000000   0.1174658 0.02869247
#Alternative      0.024 0.2344558 0.11746582   1.0000000 0.13911765
#Ambient          0.008 0.1874510 0.02869247   0.1391176 1.00000000

mat 在哪里:

mat = structure(c(125L, 11L, 3L, 3L, 1L, 11L, 112398L, 1810L, 24216L, 
3824L, 3L, 1810L, 10386L, 1220L, 298L, 3L, 24216L, 1220L, 103286L, 
2838L, 1L, 3824L, 298L, 2838L, 20400L), .Dim = c(5L, 5L), .Dimnames = list(
    c("Acousmatic", "Acoustic", "Afro-beat", "Alternative", "Ambient"
    ), c("Acousmatic", "Acoustic", "Afro.beat", "Alternative", 
    "Ambient")))

【讨论】:

    【解决方案3】:

    试试这个代码:

    maxcol <- Rfast::colMaxs(x)
    maxrow <- Rfast::rowMaxs(x)
    Rfast::eachrow(x, min(maxcol, maxrow), oper = "/")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 2018-11-26
      • 2020-07-04
      相关资源
      最近更新 更多