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

标签 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) 可用于获取整个表的总体概率,我该如何分别为每一列做呢?请帮忙。

最佳答案

本着与@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 中的情况。

关于r - 列中非零或特定数字的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816086/

相关文章:

r - 观察事件以隐藏 Shiny 的操作按钮

r - 对矩阵列表求和

actionscript-3 - 重新设置显示对象父级时的变换矩阵操作

python - 对列表进行排序并获取最常用的单词

MATLAB - FFT 中缺少基础

r - 在 R 中,如何使用索引修改/重新分配列表元素?

matlab - 多个矩阵乘以多个向量的快速乘法

python - PyCUDA 复杂矩阵乘法 - C 代码与 Python 代码

python - 在 AudioLazy 库中从 python 中的 zfilter 对象中提取数值

r - 如何让 Rcpp 工作?