Cat*_*ine 2 r frequency matrix
我的输入文件:
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)
Run Code Online (Sandbox Code Playgroud)
我想首先计算每列的频率,即
t0 t1 t2 t3 t4
freqency 5/8 5/8 6/8 3/8 4/8
Run Code Online (Sandbox Code Playgroud)
然后将频率乘以矩阵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
Run Code Online (Sandbox Code Playgroud)
如何用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
Run Code Online (Sandbox Code Playgroud)
这里发生的colMeans(abs(x))是一个长度为5的向量.我们sweep()这些值,按照列中的方式(MARGIN = 2在调用中表示),在我们去的x应用函数的数据上*.因此,列t0all中的值乘以colMeans(abs(x))[1],列t1all中的值乘以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
Run Code Online (Sandbox Code Playgroud)
给定数据框时速度要慢得多:
> system.time(replicate(1000, sweep(x, 2, means, "*")))
user system elapsed
2.072 0.000 2.074
Run Code Online (Sandbox Code Playgroud)
但这就是R中的事情.
试试这个 :
> colMeans(abs(x))
t0 t1 t2 t3 t4
0.625 0.625 0.750 0.375 0.500
Run Code Online (Sandbox Code Playgroud)
对于频率和
> 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
Run Code Online (Sandbox Code Playgroud)
获取数据帧.mapply根据*上面提到的参数,在每一列上应用该函数.也可以看看?mapply