我的输入文件:
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/