【发布时间】:2016-09-19 15:12:24
【问题描述】:
我有一个连续变量,我想将其拆分为多个 bin,返回一个数值向量(长度等于我的原始向量),其值与 bin 的值相关。每个 bin 应该有大致相同数量的元素。
这个问题:splitting a continuous variable into equal sized groups 描述了一些针对相关情况的技术。例如,如果我从
x = c(1,5,3,12,5,6,7)
我可以使用cut()获取:
cut(x, 3, labels = FALSE)
[1] 1 2 1 3 2 2 2
这是不可取的,因为因子的值只是顺序整数,它们与向量中的基础原始值没有直接关系。
另一种可能是cut2:例如:
library(Hmisc)
cut2(x, g = 3, levels.mean = TRUE)
[1] 3.5 3.5 3.5 9.5 3.5 6.0 9.5
这更好,因为现在返回值与 bin 的值相关。但它仍然不太理想,因为:
- (a) 它产生一个因子,然后需要将其转换为数字(参见 e.g.),这在代码方面既慢又笨拙。
- (b) 理想情况下,我希望能够选择是使用区间的顶部端点还是底部端点,而不仅仅是平均值。
我知道还有一些选项使用正则表达式对从cut 或cut2 返回的因子来获取区间的最高点或最低点。这些也显得过于繁琐。
这只是需要一些不太优雅的黑客攻击的情况吗?或者,是否有一些更简单的功能可以实现这一点?
我目前的最大努力如下:
MyDiscretize = function(x, N_Bins){
f = cut2(x, g = N_Bins, levels.mean = TRUE)
return(as.numeric(levels(f))[f])
}
我的目标是找到更快、更优雅、更容易适应任何一个端点的东西,而不仅仅是手段。
编辑:
澄清一下:我想要的输出是:
(a) 相当于我现在在使用
cut2的示例中可以实现的效果,但不需要将因子转换为数字。(b) 如果可能,还可以轻松选择使用区间的任一端点,而不是中点。
【问题讨论】:
标签: r