【发布时间】: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 构造来实现