Classé quantile signifie par Rpy
Question
Le véritable objectif ici est de trouver les moyens de quantile (ou des sommes ou médianes, etc.) en Python. Depuis que je ne suis pas un utilisateur de puissance de Python, mais ont utilisé R pendant un certain temps, mon itinéraire choisi est par Rpy. Cependant, je suis tombé sur le problème que la liste retournée des moyens correspondant ne sont pas à l'ordre des quantiles. J'ai en particulier, les points suivants dans 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
qui est très bon. Cependant, si je traduis le code dans Rpy, je suis
>>> 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]
Notez la liste finale est mal ordonnée (nous le savons parce que a
et b
sont tous deux commandés dans ce cas). En général, je n'ai aucun moyen de récupérer l'ordre du plus bas au plus haut quantile à Rpy. Toutes les suggestions?
En plus (non en substitution, comme je voudrais connaître la réponse à la question ci-dessus), si vous pouvez suggérer une façon directement effectuer l'analyse en python, qui sera grand aussi. (Je n'ai pas numpy ou scipy installé.) Thx!
EDIT : Pour clarifier, a
et b
sont apparié mais pas nécessairement a ordonné . Par exemple, a
est la taille des yeux et b
est la taille du nez. Je suis en train de découvrir que dans les différents quantiles de a
, quels sont les moyens des b
s correspondants. Merci.
La solution
Si vous n'avez pas besoin d'étiquettes (par exemple: (8.2,10]
), vous pouvez alors appeler cut
avec labels=FALSE
. Cela devrait maintenir l'ordre (et accélérer votre code gratuitement).
Autres conseils
Essayez rpy2.
Avec rpy2> = 2.1.0, cela pourrait être:
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)
Je n'ai aucun moyen de récupérer la ordre de la plus basse à le plus quantile dans Rpy
Si le tri de la liste du plus bas au plus haut permet de résoudre votre problème, essayez sorted(quintile_means)
.