这里的真正目标是在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
的方法是什么。感谢。
答案 0 :(得分: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)
答案 1 :(得分:2)
如果您不需要标签(例如:(8.2,10]
),则可以使用cut
致电labels=FALSE
。这应该保持秩序(并免费加速你的代码)。
答案 2 :(得分:0)
我无法恢复 正确的顺序从最低到 Rpy中的最高分位数
如果将列表从最低到最高排序可以解决您的问题,请尝试sorted(quintile_means)
。