2011-04-28 33 views
2

我的输入文件:频率的非零或特定数量

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)可以用来获得整个表的总体概率,我怎样才能为每个列单独做?请提供帮助。

+1

@凯瑟琳:为了正确,你不使用矩阵,但与数据框。这种差异在R中非常重要,因此请确保您了解类型之间的差异。 – 2011-04-28 09:21:09

+3

@凯瑟琳:其次,如果你和凯瑟琳一样被吊销,然后称自己为莎莉,那就要小心。如果管理员发现您继续创建新帐户,则可以根据IP地址禁止该站点。因此,如果您不同意暂停,请发送邮件至[email protected]并解释您的案例。如果你保持你的问题达到这个水平,悬架可以为我解除。但是你需要保持在SO的规则之内,并严格禁止不同的账户。 – 2011-04-28 09:21:48

+1

我你有很多个性:http://stackoverflow.com/users/729550/sally。这个马戏表演必须停止。 – Chase 2011-04-28 15:03:35

回答

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

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.