通过Rpy计算排序分位数均值

2 投票
3 回答
752 浏览
提问于 2025-04-16 03:04

这里的主要目标是想在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。)谢谢!

编辑:为了澄清一下,ab配对的,但不一定是有序的。例如,a是眼睛的大小,b是鼻子的大小。我想找出在不同分位数的a中,对应的b的均值是什么。谢谢。

3 个回答

0

我就是不知道怎么在Rpy中把数据从最低到最高的顺序恢复过来。

如果把列表从最低到最高排序能解决你的问题,可以试试 sorted(quintile_means)

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)
2

如果你不需要标签(比如说 (8.2,10]),那么你可以在调用 cut 函数的时候加上 labels=FALSE。这样做可以保持顺序,并且还能让你的代码运行得更快,完全免费哦。

撰写回答