Перекодировать переменную продолжения на основе предопределенного диапазона в r

#r #intervals #recode

Вопрос:

Я хотел бы перекодировать непрерывную переменную на основе предопределенных интервалов и классифицировать переменные. Я знаю ifelse , что это сработало бы, но мне это кажется очень утомительным. Вот как выглядит мой образец набора данных:

 library(ggplot2)

df <- data.frame(
  id = c(1,2,3,4,5),
  score = c(1.5, 2, 2.5, 3.2, 4.5))

> df
  id score
1  1   1.5
2  2   2.0
3  3   2.5
4  4   3.2
5  5   4.5
 

здесь мои предопределенные интервалы:

 intervals <- cut_interval(seq(1, 7), n=5)
> intervals
[1] [1,2.2]   [1,2.2]   (2.2,3.4] (3.4,4.6] (4.6,5.8] (5.8,7]   (5.8,7]  
Levels: [1,2.2] (2.2,3.4] (3.4,4.6] (4.6,5.8] (5.8,7]
 

С этими интервалами желаемый/перекодированный набор данных должен выглядеть следующим образом:

 df <- data.frame(
  id = c(1,2,3,4,5),
  score = c(1.5, 2, 2.5, 3.2, 4.5),
  intervals = c("[1,2.2]", "[1,2.2]", "(2.2,3.4]", "(2.2,3.4]", "(3.4,4.6]"),
  cat = c(1,1,2,2,3))

> df
  id score intervals cat
1  1   1.5   [1,2.2]   1
2  2   2.0   [1,2.2]   1
3  3   2.5 (2.2,3.4]   2
4  4   3.2 (2.2,3.4]   2
5  5   4.5 (3.4,4.6]   3
 

Есть какие-нибудь мысли?
Спасибо!

Ответ №1:

Похоже, вам просто нужно будет извлечь точки разреза intervals и применить их к df$score ним . В базе R вы могли бы

 df$intervals <-
  cut(df$score, breaks = unique(as.numeric(
    gsub("[\(|\]|\[|\]|\)]", "", unlist(strsplit(levels(
      cut(seq(1, 7), breaks = 5)
    ), ",")))
  )))
df$cat <- as.numeric(df$intervals)
 

Ответ №2:

Вот некоторые, возможно, релевантные онлайнеры с (моим) santoku пакетом:

 library(santoku)

# cut into equal-sized intervals of size 1.2
df$cat <- chop_width(df$score, 1.2) 

# cut into exactly 5 intervals of equal width
df$cat <- chop_evenly(df$score, 5)