[R] frequency

(Ted Harding) Ted.Harding at manchester.ac.uk
Thu May 6 20:08:55 CEST 2010


On 06-May-10 17:06:26, n.vialma at libero.it wrote:
> 
> Dear list,
> Im trying to do the following operation but im not able to do it
> This is my table:
>          1 2 3  
> 1      0 7 4 
> 2      0 2 0 
> 3      0 1 3 
> 4      0 3 4  
> 
> what i would like to do is
> 
> divide each row values with the corresponding column' sum,namely:
> 
>          1           2              3 
> 1      0           0.54       0.36 
> 2      0           0.15        0 
> 3      0           0.08       0.27  
> 4      0           0.23       0.36
> 
> thanks for your attention

There is a problem with the first columns, because it's sum is 0,
so you would be doing "0/0", with result "NaN". So, for illustration
(and to allow easy verification) I've replaced your first column
with 1,2,3,4.

Suppose your table is a matrix:

  M <- matrix(c(1,2,3,4,7,2,1,3,4,0,3,4),ncol=3)
  M
  #      [,1] [,2] [,3]
  # [1,]    1    7    4
  # [2,]    2    2    0
  # [3,]    3    1    3
  # [4,]    4    3    4

Note that the entries are given in the order of moving down
successive columns. That is what a mtrix is: a vector of
numbers, in that order, with in addition a "dim" attribute:

  dim(M)
  # [1] 4 3

Now you can do the clever bit. Transpose the matrix M:
  tM <- t(M)
  tM
  #      [,1] [,2] [,3] [,4]
  # [1,]    1    2    3    4
  # [2,]    7    2    1    3
  # [3,]    4    0    3    4

This is a new matrix whose elements will again be read in the
order of going down succesive columns, i.e. as
  c(1,7,4,2,2,0,3,1,3,4,3,3)

Now compute the column sums of tM:

  Csums <- colSums(tM)
  Csums
  # [1] 10 13 11

Now, in the expression "tM/Csums", the successive elements of tM,
in the above order, will be divided by the successive elements
of Csums, with Csums being recycled until it is finished:

  tM/Csums
  #           [,1]      [,2]       [,3]      [,4]
  # [1,] 0.1000000 0.2000000 0.30000000 0.4000000
  # [2,] 0.5384615 0.1538462 0.07692308 0.2307692
  # [3,] 0.3636364 0.0000000 0.27272727 0.3636364

But this is the transpose of what you want, so transpose it back
to t(tM/Rsums).

So, just as a full check:

  M
  #      [,1] [,2] [,3]
  # [1,]    1    7    4
  # [2,]    2    2    0
  # [3,]    3    1    3
  # [4,]    4    3    4

  Csums <- colSums(M)
  Csums
  # [1] 10 13 11
  
  t(tM/Csums)
  #      [,1]       [,2]      [,3]
  # [1,]  0.1 0.53846154 0.3636364
  # [2,]  0.2 0.15384615 0.0000000
  # [3,]  0.3 0.07692308 0.2727273
  # [4,]  0.4 0.23076923 0.3636364

Explicitly: the division of t(M)

= #      [,1] [,2] [,3] [,4]
  # [1,]    1    2    3    4
  # [2,]    7    2    1    3
  # [3,]    4    0    3    4

by Csums=c(10,13,11) has been done as

 1/10,7/13,4/11, 2/10,2/13,0/11, 3/10,1/13,3/13, 4/10,3/13,4/11

Hoping this helps,
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 06-May-10                                       Time: 19:08:51
------------------------------ XFMail ------------------------------



More information about the R-help mailing list