将数值变量分类为20个区间(R)

时间:2017-11-08 17:03:17

标签: r

当我尝试将我的数值变量转换为分类变量时,我遇到了一些问题。我希望将我的专栏“Price”分成20个分区(然后为了做分类树)。

我尝试使用功能剪切,但它有效,但我的间隔用科学记数法表示......

以下是我的数据示例:

Mydata <- data.frame(
Price = c(13500,13750,13950,14950,13750,12950)
)

这是我的代码:

Mydata[,2] = cut(Mydata$Price, 3, include.lowest=TRUE)

然后,我的第二个Colonne有像(3.11e + 04,3.25e + 04)这样的数字。 我也使用参数labels = FALSE,但这不是我正在寻找的(然后,箱子用数字表示 - > 1,2,3,...,20。我希望它们被表达间隔 - > [0; 1000],[1000,2000]等......)

提前感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我找到了解决方案!用dig.lab

Mydata <- data.frame(
Price = c(13500,13750,13950,14950,13750,12950)
)

这是我的代码:

Mydata[,2] = cut(Mydata$Price, 3, include.lowest=TRUE, dig.lab = 5)

无论如何,谢谢您的提示:)

答案 1 :(得分:0)

如果您的对象Mydata有类matrix,那么我可以了解可能发生的事情:

cut()函数返回如下所示的因子:

> x <- runif(10, 0, 2)
> cut(x, 2)
 [1] (1.01,1.95]  (1.01,1.95]  (0.069,1.01] (1.01,1.95]  (1.01,1.95]  
 (1.01,1.95]  (1.01,1.95]  (1.01,1.95]  (1.01,1.95] 
 [10] (1.01,1.95] 
 Levels: (0.069,1.01] (1.01,1.95]

cut()函数自然返回一组间隔(按照您的要求)。输出是因子这很重要。现在看一下当我强制输出为数字时会发生什么:

> as.numeric(cut(x, 2))
[1] 2 2 1 2 2 2 2 2 2 2

这是一个数字向量。为什么这很重要?因为matrix中的类R的对象只能有一种类型。添加到矩阵的任何新值都将强制到矩阵中其余条目的类型。观看:

> X_mat <- matrix(1:10L, nrow = 10, ncol = 2)
> X_mat[, 2] <- cut(x, 2)
> X_mat
      [,1] [,2]
 [1,]    1    2
 [2,]    2    2
 [3,]    3    1
 [4,]    4    2
 [5,]    5    2
 [6,]    6    2
 [7,]    7    2
 [8,]    8    2
 [9,]    9    2
[10,]   10    2

cut()函数返回的时间间隔消失了,因为它们已转换为类numeric以匹配矩阵X_mat的其余部分。如果我们使用数据框怎么办?

> X_df <- data.frame(x1 = 1:10L)
> X_df[, 2] <- cut(x, 2)
> X_df
  x1           V2
1   1  (1.01,1.95]
2   2  (1.01,1.95]
3   3 (0.069,1.01]
4   4  (1.01,1.95]
5   5  (1.01,1.95]
6   6  (1.01,1.95]
7   7  (1.01,1.95]
8   8  (1.01,1.95]
9   9  (1.01,1.95]
10 10  (1.01,1.95] 

基本上,如果您想保留cut()输出的结构,则您的数据需要位于data.frame而不是matrix。希望这有帮助!