在R中基于范围创建分类变量

10
我有一个包含整数列的数据框,我想要使用它作为参考来创建一个新的分类变量。我想将该变量分成三组并自己设置范围(例如0-5、6-10等)。我尝试了cut函数,但它是基于正态分布将变量分组的,而我的数据是右偏的。我也尝试使用if/then语句,但这会输出一个true/false值,我想保留原始变量。我相信有一种简单的方法可以快速地完成这个任务,但我无法找到解决方案。是否有任何建议可以帮助我快速地完成这个任务呢?
我想实现的效果类似于下面这样:
x   x.range
3   0-5
4   0-5
6   6-10
12  11-15
3个回答

18
x <- rnorm(100,10,10)
cut(x,c(-Inf,0,5,6,10,Inf))

12

据我所知,Ian的答案(cut)是最常用的方法。

我更喜欢使用Lattice包中的shingle

对于指定分箱间隔的参数,我觉得它更加直观。

您可以这样使用shingle

# mock some data
data = sample(0:40, 200, replace=T)

a = c(0, 5);b = c(5,9);c = c(9, 19);d = c(19, 33);e = c(33, 41)

my_bins = matrix(rbind(a, b, c, d, e), ncol=2)

# returns: (the binning intervals i've set)
        [,1] [,2]
 [1,]    0    5
 [2,]    5    9
 [3,]    9   19
 [4,]   19   33
 [5,]   33   41

shx = shingle(data, intervals=my_bins)

#'shx' at the interactive prompt will give you a nice frequency table:
# Intervals:
   min max count
1   0   5    23
2   5   9    17
3   9  19    56
4  19  33    76
5  33  41    46

1
如果你愿意设置一个最小值和最大值的矩阵,这是一个不错的解决方案。如果你有一个动态范围,这可能会很繁琐。 - Roman Luštrik
@ Roman,我正想着这个问题。我有一个类似的问题,但是它涉及到动态范围。你有什么建议在这种情况下该怎么做? - PikkuKatja

2
我们可以使用来自cutr包的smart_cut函数:
devtools::install_github("moodymudskipper/cutr")
library(cutr)

x <- c(3,4,6,12)

从1开始,每隔5个进行切割:

smart_cut(x,list(5,1),"width" , simplify=FALSE)
# [1] [1,6)   [1,6)   [6,11)  [11,16]
# Levels: [1,6) < [6,11) < [11,16]

为了准确得到您所需的输出:
smart_cut(x,c(0,6,11,16), labels = ~paste0(.y[1],'-',.y[2]-1), simplify=FALSE, open_end = TRUE)
# [1]   0-5   0-5  6-10 11-15
# Levels:   0-5 <  6-10 < 11-15

更多关于cutr和smart_cut的信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接