Skip to main content
 首页 » 编程设计

r之用 R 中的 colSums 划分列

2025年02月15日70zfyouxi

我正在尝试缩放矩阵中的值,以便每一列加起来为一。我试过了:

m = matrix(c(1:9),nrow=3, ncol=3, byrow=T) 
     [,1] [,2] [,3] 
[1,]    1    2    3 
[2,]    4    5    6 
[3,]    7    8    9 
 
colSums(m) 
12 15 18 
 
m = m/colSums(m) 
          [,1]      [,2] [,3] 
[1,] 0.08333333 0.1666667 0.25 
[2,] 0.26666667 0.3333333 0.40 
[3,] 0.38888889 0.4444444 0.50 
 
colSums(m) 
[1] 0.7388889 0.9444444 1.1500000 

所以显然这行不通。
然后我尝试了这个:
m = m/matrix(rep(colSums(m),3), nrow=3, ncol=3, byrow=T) 
          [,1]      [,2]      [,3] 
[1,] 0.08333333 0.1333333 0.1666667 
[2,] 0.33333333 0.3333333 0.3333333 
[3,] 0.58333333 0.5333333 0.5000000 
 
 m = colSums(m) 
[1] 1 1 1 

所以这有效,但感觉我在这里遗漏了一些东西。这不可能是常规做法。我确定我在这里很愚蠢。
您能提供的任何帮助将不胜感激
干杯,
戴维

请您参考如下方法:

?sweep ,例如:

> sweep(m,2,colSums(m),`/`) 
           [,1]      [,2]      [,3] 
[1,] 0.08333333 0.1333333 0.1666667 
[2,] 0.33333333 0.3333333 0.3333333 
[3,] 0.58333333 0.5333333 0.5000000 

或者你可以转置矩阵然后 colSums(m)被正确回收。之后不要忘记再次转置,如下所示:
> t(t(m)/colSums(m)) 
           [,1]      [,2]      [,3] 
[1,] 0.08333333 0.1333333 0.1666667 
[2,] 0.33333333 0.3333333 0.3333333 
[3,] 0.58333333 0.5333333 0.5000000 

或者你使用函数 prop.table()做基本相同的事情:
> prop.table(m,2) 
           [,1]      [,2]      [,3] 
[1,] 0.08333333 0.1333333 0.1666667 
[2,] 0.33333333 0.3333333 0.3333333 
[3,] 0.58333333 0.5333333 0.5000000 

时差相当小。 sweep()函数和 t()技巧是最灵活的解决方案, prop.table()仅适用于这种特殊情况