#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)