2010-08-20 72 views
2

這裏的真正目標是在Python中查找分位數的手段(或總和或中位數等)。由於我不是Python的強大用戶,但已經使用R一段時間,我選擇的路線是通過Rpy。但是,我遇到了這樣的問題,即返回的手段清單並不對應分位數的順序。特別是,我有以下在R:通過Rpy分類的分位數平均值

> a = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
> b = c(2, 4, 20, 40, 200, 400, 2000, 4000, 20000, 40000) 
> prob = seq(0,5)/5 
> br = quantile(a,prob) 
> rcut = cut(a, br, include.lowest = TRUE) 
> quintile_means = tapply(b, rcut, mean) 
> quintile_means 
[1,2.8] (2.8,4.6] (4.6,6.4] (6.4,8.2] (8.2,10] 
     3  30  300  3000  30000 

這是非常好的。但是,如果我的代碼翻譯成RPY,我

>>> import rpy 
>>> from rpy import r 
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> b = [2, 4, 20, 40, 200, 400, 2000, 4000, 20000, 40000] 
>>> prob = [ x/5.0 for x in range(6)] 
>>> br = r.quantile(a, prob) 
>>> rcut = r.cut(a, br, include_lowest=r.TRUE) 
>>> quintile_means = r.tapply(b, rcut, r.mean) 
>>> print quintile_means 
[30.0, 300.0, 3000.0, 30000.0, 3.0] 

注意最後名單是錯誤排序(我們知道,因爲ab都在這種情況下訂購)。一般來說,我無法從Rpy中的最低到最高分位數恢復正確的順序。有什麼建議麼?如果你可以建議一種直接在python中執行分析的方法,那也將是非常棒的。 (我沒有安裝numpy或scipy。)Thx!

編輯:爲了澄清,ab配對但不一定下令。例如,a是眼睛的大小,而b是鼻子的大小。我試圖找出在a的各個分位數中,記者b的含義是什麼。謝謝。

回答

2

如果你不需要標籤(例如:(8.2,10]),那麼你可以調用cutlabels=FALSE。這應該保持順序(並且免費加速你的代碼)。

+0

工程就像一個魅力。謝謝。 – Zhang18 2010-08-20 15:10:33

0

我只是沒有辦法從最低 正確的順序恢復到 最高位數在RPY

如果列表進行排序,從最低到最高的解決您的問題,嘗試sorted(quintile_means)

+0

不,這並不能解決問題。例如,如果'b = [20,40,2,4,200,400,...]',那麼正確的有序輸出應該是'[30,3,300,...]'會做的如果這麼簡單。 – Zhang18 2010-08-20 13:45:12

4

嘗試rpy2。

隨着rpy2> = 2.1.0,這可能是:

from rpy2.robjects.vectors import IntVector 
from rpy2.robjects.packages import importr 
base = importr('base') 
stats = importr('stats') 

a = IntVector((1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) 
b = IntVector((2, 4, 20, 40, 200, 400, 2000, 4000, 20000, 40000)) 
prob = base.seq(0,5).ro/5 
br = stats.quantile(a,prob) 
rcut = base.cut(a, br, include_lowest = True) 
quintile_means = base.tapply(b, rcut, stats.mean) 
print(quintile_means)