2

ここでの本当の目標は、Python で分位平均 (または合計、または中央値など) を見つけることです。私は Python のパワー ユーザーではありませんが、しばらく R を使用していたので、選択したルートは Rpy 経由です。しかし、返された平均のリストが分位数の順序に対応していないという問題に遭遇しました。特に、Rには次のものがあります。

> 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]

最終的なリストの順序が間違っていることに注意してください (この場合、 と の両方が順序付けられているためa、それはわかっています)。b一般に、Rpy の最小分位数から最大分位数までの正しい順序を復元する方法がありません。助言がありますか?

さらに(上記の質問に対する答えを知りたいので、代用ではありません)、Pythonで直接分析を実行する方法を提案できれば、それも素晴らしいでしょう。(numpy または scipy がインストールされていません。) Thx!

編集:明確にするために、aペアになっbていますが、必ずしも順序付けられているわけではありません。たとえば、は目の大きさで、 は鼻の大きさです。私は、 のさまざまな分位点で、特派員s の平均が何であるかを調べようとしています。ありがとう。abab

4

3 に答える 3

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)
于 2010-08-20T14:54:31.927 に答える
2

ラベルが必要ない場合 (例: )、で(8.2,10]呼び出すことができます。これにより、秩序が保たれます (そして無料でコードを高速化できます)。cutlabels=FALSE

于 2010-08-20T14:57:07.340 に答える
0

Rpy の最低分位点から最高分位点までの正しい順序を復元する方法がありません。

リストを低いものから高いものへ並べ替えると問題が解決する場合は、 を試してくださいsorted(quintile_means)

于 2010-08-20T13:42:24.910 に答える