2011-04-28 93 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.