Создание категориальной переменной в R на основе диапазона

у меня есть фрейм данных со столбцом целых чисел, который я хотел бы использовать в качестве ссылки для создания новой категориальной переменной. Я хочу разделить переменную на три группы и установить диапазоны самостоятельно (т. е. 0-5, 6-10 и т. д.). Я пытался!--1--> но это делит переменную на группы на основе нормального распределения, и мои данные искажены. Я также попытался использовать операторы if/then, но это выводит значение true/false, и я хотел бы сохранить свою исходную переменную. Я уверен, что там это простой способ сделать это, но я не могу понять это. Есть советы, как сделать это быстро?

Я имел в виду что-то вроде этого:

x   x.range
3   0-5
4   0-5
6   6-10
12  11-15

3 ответов


ответ Яна (вырезать) является наиболее распространенным способом для этого, насколько я знаю.

Я предпочитаю использовать Гонта С решетки пакета

аргумент, указывающий интервалы бинирования, кажется мне немного более интуитивным.

вы используете Гонта вот так:

# 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

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

можно использовать smart_cut пакета cutr:

devtools::install_github("moodymudskipper/cutr")
library(cutr)

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

вырезать с интервалами длины 5, начиная с 1:

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