Отсортированный квантильный средний через RPY
Вопрос
Реальная цель здесь - найти квантильные средства (или суммы, или медиана и т. Д.) В Python. Поскольку я не пользователь Power of 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.) Спасибо!
РЕДАКТИРОВАТЬ: Чтобы уточнить, a
и b
находятся в паре но не обязательно приказал. Анкет Например, a
размер глаз и b
размер носа. Я пытаюсь узнать это в различных квантилях a
, каковы средства корреспондента b
с Спасибо.
Решение
Если вам не нужны этикетки (например,: (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)
.