这里的真正目标是在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]

注意最终列表是错误的(我们知道的,因为 ab 在这种情况下都订购)。通常,我只是无法从RPY中的最低点到最高分数恢复正确的顺序。有什么建议么?

此外(我想知道上述问题的答案,而不是替代),如果您可以提出一种直接在Python中进行分析的方法,那也很棒。 (我没有安装Numpy或Scipy。)THX!

编辑: : 澄清, ab配对 但不一定 订购. 。例如, a 是眼睛的大小 b 是鼻子的大小。我试图在各种分位数中找出 a, ,通讯员的手段是什么 bs。谢谢。

有帮助吗?

解决方案

如果您不需要标签(例如: (8.2,10])你可以打电话 cutlabels=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).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top