Вот данные, с которыми я работаю:
x <- getURL("https://raw.githubusercontent.com/dothemathonthatone/maps/master/testmain.csv")
data <- read.csv(text = x)
Я хочу создать фиктивную переменную для верхней, средней и нижней трети значений в year_hh_inc
. Каждое значение в моем столбце идентификатора reg_schl
потенциально может иметь более одного значения для year_hh_inc
, поэтому фиктивная переменная должна группироваться по reg_schl
. Я хочу иметь возможность различать значения в year_hh_inc
внутри каждого уникального reg_schl
.
На данный момент у меня есть следующее решение, опубликованное ниже как решение от Sotos:
data %>%
group_by(reg_schl) %>%
mutate(category = cut(year_hh_inc, breaks = (quantile(year_hh_inc, c(0, 1 / 3, 2 / 3, 1), na.rm = TRUE)), labels = c("low", "middle", "high"), include.lowest = TRUE), vals = 1) %>%
pivot_wider(names_from = category, values_from = vals, values_fill = list(vals = 0))
Это работает хорошо.
Я также использовал это решение, предоставленное Алланом :
cut_by_id <- function(x)
{
x$category <- cut(x$year_hh_inc, quantile(x$year_hh_inc, c(0,1/3,2/3,1), na.rm = TRUE),
labels = c("low","middle","high"), include.lowest = TRUE)
return(x)
}
data <- do.call(rbind, lapply(split(data, data$id), cut_by_id))