列中非零或特定数字的频率

时间:2011-04-28 08:55:14

标签: r matrix frequency

我的输入文件:

 x <- read.table(textConnection('
      t0  t1  t2  t3  t4
  aa  0   1   0   1   0
  bb  1   0   1   0   1
  cc  0   0   0   0   0
  dd  1   1   1   0   1
  ee  1   1   1   0   0
  ff  0   0   1   0   1
  gg  -1  -1  -1  -1  0
  hh  -1  1   -1  1   -1
 '), header=TRUE)

我想首先计算每列的频率,即

          t0   t1   t2   t3   t4
freqency  5/8  5/8  6/8  3/8  4/8

然后将频率乘以矩阵x,以获得新矩阵,如下所示:

       t0    t1     t2     t3     t4
  aa   0     5/8    0      3/8    0
  bb   5/8   0      6/8    0      4/8
  cc   0     0      0      0      0
  dd   5/8   5/8    6/8    0      4/8
  ee   5/8   5/8    6/8    0      0
  ff   0     0      6/8    0      4/8
  gg  -5/8  -5/8   -6/8   -3/8    0
  hh  -5/8   5/8   -6/8    3/8   -4/8

如何用R做?我从手册中了解到prop.table(x)可用于获取整个表的整体概率,我如何单独为每个列执行此操作?请帮助。

2 个答案:

答案 0 :(得分:7)

与@Joris的答案一样,这就是精彩的sweep()函数所属的地方:

> sweep(x, MARGIN = 2, colMeans(abs(x)), "*")
       t0     t1    t2     t3   t4
aa  0.000  0.625  0.00  0.375  0.0
bb  0.625  0.000  0.75  0.000  0.5
cc  0.000  0.000  0.00  0.000  0.0
dd  0.625  0.625  0.75  0.000  0.5
ee  0.625  0.625  0.75  0.000  0.0
ff  0.000  0.000  0.75  0.000  0.5
gg -0.625 -0.625 -0.75 -0.375  0.0
hh -0.625  0.625 -0.75  0.375 -0.5

这里发生的事情是colMeans(abs(x))是一个长度为5的向量。我们sweep()这些值,按列(由调用中的MARGIN = 2表示),超过数据我们前往x应用函数*。因此,列t0中的值全部乘以colMeans(abs(x))[1],列t1中的值全部乘以colMeans(abs(x))[2],依此类推。

sweep()的优势在于给定矩阵时非常快:

X <- data.matrix(x)
> system.time(replicate(1000, sweep(X, 2, means, "*")))
   user  system elapsed 
  0.115   0.000   0.118 
> system.time(replicate(1000, mapply(`*`, x, means)))
   user  system elapsed 
  0.308   0.001   0.309 
> system.time(replicate(1000, mapply(`*`, X, means)))
   user  system elapsed 
  0.204   0.000   0.205

给定数据框时速度要慢得多:

> system.time(replicate(1000, sweep(x, 2, means, "*")))
   user  system elapsed 
  2.072   0.000   2.074

但这就是R中的事情。

答案 1 :(得分:6)

试试这个:

> colMeans(abs(x))
   t0    t1    t2    t3    t4 
0.625 0.625 0.750 0.375 0.500 

表示频率和

> mapply(`*`,x,colMeans(abs(x)))
         t0     t1    t2     t3   t4
[1,]  0.000  0.625  0.00  0.375  0.0
[2,]  0.625  0.000  0.75  0.000  0.5
[3,]  0.000  0.000  0.00  0.000  0.0
[4,]  0.625  0.625  0.75  0.000  0.5
[5,]  0.625  0.625  0.75  0.000  0.0
[6,]  0.000  0.000  0.75  0.000  0.5
[7,] -0.625 -0.625 -0.75 -0.375  0.0
[8,] -0.625  0.625 -0.75  0.375 -0.5

获取数据帧。 mapply在每个列上应用函数*,并提取所提到的参数。另请参阅?mapply