如何使用自定义中断从连续变量创建分箱因子变量?

时间:2012-09-10 14:35:30

标签: r

我有一个看起来像这样的矢量:

dataset <- c(4,7,9,1,10,15,18,19,3,16,10,16,12,22,2,23,16,17)

我想创建四个虚拟类别,其中我通过自定义中断来连接连续数据集。 ..例如:1:4,5:9,10:17,18:23。

输出虚拟类别与原始连续向量的长度相同(在这种情况下为18),但现在每个分箱的虚拟变量只包含1或0.

2 个答案:

答案 0 :(得分:16)

使用cut

data.frame(dataset, bin=cut(dataset, c(1,4,9,17,23), include.lowest=TRUE))

答案 1 :(得分:8)

我同意约书亚的观点,cut是大多数人会为此任务想到的。我不喜欢它的默认值,更喜欢左边闭合间隔,用cut正确设置它是一个小麻烦(虽然可以做到。幸运的是,我的虚弱大脑,Frank Harrell设计的他的Hmisc包中的cut2函数我更喜欢它的默认值。第三种方法是使用findInterval,这特别适用于你希望将结果用作另一个提取或选择过程的索引的问题。如果您将as.numeric应用于cut的结果,其结果大致相同:

require(Hmisc)
cut2(dataset, c(1,4,9,17,23) )
 [1] [ 4, 9) [ 4, 9) [ 9,17) [ 1, 4) [ 9,17) [ 9,17) [17,23] [17,23] [ 1, 4) [ 9,17)
[11] [ 9,17) [ 9,17) [ 9,17) [17,23] [ 1, 4) [17,23] [ 9,17) [17,23]

(请注意findInterval将使用上限作为封闭端形成一个额外的间隔,除非您用Inf替换最大值,这是R中无穷大的保留字。)

findInterval(dataset, c( c(1,4,9,17,23) ) )
 [1] 2 2 3 1 3 3 4 4 1 3 3 3 3 4 1 5 3 4
as.numeric( cut(dataset, c(1,4,9,17,Inf), include.lowest=TRUE))
 [1] 1 2 2 1 3 3 4 4 1 3 3 3 3 4 1 4 3 3
as.numeric( cut(dataset, c(1,4,9,17,23), include.lowest=TRUE))
 [1] 1 2 2 1 3 3 4 4 1 3 3 3 3 4 1 4 3 3