質問
ここでの本当の目標は、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
それは ペア しかし、必ずしもそうではありません 順序付けられました. 。例えば、 a
目の大きさです b
鼻の大きさです。私はのさまざまな分位数でそれを見つけようとしています a
, 、特派員の手段は何ですか b
s。ありがとう。
解決
ラベルが必要ない場合(例: (8.2,10]
)その後、電話することができます cut
と labels=FALSE
. 。これにより、注文を維持する必要があります(そして、コードを無料でスピードアップします)。
他のヒント
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)
RPYの最低から最高位の位置から最高の順序を回復する方法はありません
リストを最低から最高に並べ替えて問題を解決する場合は、試してみてください sorted(quintile_means)
.