11

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

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。

4

2 回答 2

18

使用cut

data.frame(dataset, bin=cut(dataset, c(1,4,9,17,23), include.lowest=TRUE))
于 2012-09-10T14:41:42.030 回答
9

我同意 Joshua 的观点,这cut是大多数人对这项任务的看法。我不喜欢它的默认值,更喜欢左闭区间,正确设置它是一个小麻烦cut(尽管可以做到。幸运的是,对于我虚弱的大脑,Frank Harrellcut2在他的 Hmisc 中设计了一个函数我更喜欢其默认值的包。第三种选择是使用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]

(请注意,除非将最大值替换为 R 中无穷大的保留字,findInterval否则将使用上限作为闭合端以形成额外的区间。)Inf

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
于 2012-09-10T16:22:41.273 回答