Предположим, у вас есть данные, которые выглядят примерно так
df <- data.frame(income = rnorm(1000,77345,30569))
Вы добавляете столбец, чтобы указать коэффициент квартильного интервала, которому соответствует каждое наблюдение.
df$quant <- cut(df$income, quantile(df$income))
Уровни факторов выглядят примерно так
Levels: (-4.48e+04,5.6e+04] (5.6e+04,7.69e+04] (7.69e+04,9.73e+04] (9.73e+04,1.64e+05]
Как вы можете программно, а не вручную изменить интервалы, чтобы они красиво распечатывались в сводной таблице частот?
df %>% count(quant)
Который печатает так:
quant n
1 (-4.48e+04,5.6e+04] 249
2 (5.6e+04,7.69e+04] 250
3 (7.69e+04,9.73e+04] 250
4 (9.73e+04,1.64e+05] 250
Я хочу, чтобы это выглядело примерно так
quant n
1 ($44,800,$56,000] 249
2 ($56,000,$76,900] 250
3 ($76,900,$97,300] 250
4 ($97,300,$164,000] 250
Это только для печати (в отчете Rmarkdown). Я уже сделал все расчеты и графики без проблем.





cut2 может принять formatfun аргумент
library(Hmisc)
library(scales)
df$quant2 <- cut2(df$income,digits = 5, cuts = quantile(df$income),
formatfun = function(x) paste0("$", comma(x)), onlycuts = TRUE)
-выход
> head(df)
income quant2 quant
1 60657.97 [$55,485,$76,547) (5.55e+04,7.65e+04]
2 93747.88 [$76,547,$96,620) (7.65e+04,9.66e+04]
3 90172.46 [$76,547,$96,620) (7.65e+04,9.66e+04]
4 59504.10 [$55,485,$76,547) (5.55e+04,7.65e+04]
5 103251.01 [$96,620,$178,251] (9.66e+04,1.78e+05]
6 85477.03 [$76,547,$96,620) (7.65e+04,9.66e+04]
Если мы хотим изменить исходный столбец cut
library(tidyr)
library(stringr)
df <- df %>%
mutate(quant = str_remove_all(quant, "\\(|\\]")) %>%
separate(quant, into = c('q1', 'q2'), sep = ",", convert = TRUE) %>%
mutate(across(q1:q2, ~ dollar(.x)),
quant = glue::glue("({q1},{q2}]"), q1 = NULL, q2 = NULL)
-выход
> head(df)
income quant
1 60657.97 ($55,500,$76,500]
2 93747.88 ($76,500,$96,600]
3 90172.46 ($76,500,$96,600]
4 59504.10 ($55,500,$76,500]
5 103251.01 ($96,600,$178,000]
6 85477.03 ($76,500,$96,600]
@guasi обновил пост
Вот еще одно решение:
q <- quantile(df$income)
qlbls <- sapply(1:4,function(i) paste0("(",scales::dollar(q[i]),",",scales::dollar(q[i+1]),"]"))
df$quant <- cut(df$income, q, labels = qlbls)
-выход
> head(df)
income quant
1 43842.61 ($29,745.22,$56,569.49]
2 73176.84 ($56,569.49,$76,945.41]
3 85658.10 ($76,945.41,$99,013.99]
4 84613.72 ($76,945.41,$99,013.99]
5 130301.96 ($99,013.99,$179,552]
6 61917.61 ($56,569.49,$76,945.41]
Это решение очень гибкое, вы можете сделать фактор таким красивым, как вам нравится.
Спасибо, это работает @akrun! Есть ли решение без использования пакета
Hmisc?