Форматировать метки, создаваемые cut() в процентах
Мне нужно применить cut
к непрерывной переменной, чтобы показать ее с цветовой шкалой Brewer в ggplot2, как в Установка точек останова для данных с помощью функции scale_fill_brewer() в ggplot2. Непрерывная переменная является относительной разницей, и я хотел бы отформатировать данные как "18,2%" вместо "0,182". Есть ли простой способ достичь этого?
x <- runif(100)
levels(cut(x, breaks=10))
[1] "(0.0223,0.12]" "(0.12,0.218]" "(0.218,0.315]" "(0.315,0.413]"
[5] "(0.413,0.511]" "(0.511,0.608]" "(0.608,0.706]" "(0.706,0.804]"
[9] "(0.804,0.901]" "(0.901,0.999]"
Я хотел бы, например, чтобы первый уровень отображался как (2.23 %, 12 %]
. Есть ли лучшая альтернатива cut
?
Ответы
Ответ 1
Мой пакетный cutr
очень похож на функцию @krlmlr (чего я не знал до сих пор).
cutf
просто cut
с аргументом format_fun
и ...
который передается format_fun
, а не cut
как в cut_format
.
smart_cut
имеет больше возможностей и различных настроек по умолчанию:
devtools::install_github("moodymudskipper/cutr")
library(cutr)
x <- seq(0.1, 0.9, by = 0.2)
breaks <- seq(0, 1, by = 0.25)
cutf(x, breaks, format_fun = scales::percent)
# [1] (0%,25%] (25%,50%] (25%,50%] (50%,75%] (75%,100%]
# Levels: (0%,25%] (25%,50%] (50%,75%] (75%,100%]
smart_cut(x, breaks, format_fun = scales::percent,simplify = F, closed = "right")
# [1] [0%,25%] (25%,50%] (25%,50%] (50%,75%] (75%,100%]
# Levels: [0%,25%] < (25%,50%] < (50%,75%] < (75%,100%]
Hmisc::cut2
теперь также имеет аргумент formatfun
:
library(Hmisc)
Hmisc::cut2(x, breaks, formatfun = scales::percent)
# [1] [0%,25%) [25%,50%) [50%,75%) [50%,75%) [75%,100%]
# Levels: [0%,25%) [25%,50%) [50%,75%) [75%,100%]
Ответ 2
Я реализовал cut_format()
в версии 0.2-3 моего пакета kimisc
, версия 0.3 теперь на CRAN.
# devtools::install_github("krlmlr/kimisc")
x <- seq(0.1, 0.9, by = 0.2)
breaks <- seq(0, 1, by = 0.25)
cut(x, breaks)
## [1] (0,0.25] (0.25,0.5] (0.25,0.5] (0.5,0.75] (0.75,1]
## Levels: (0,0.25] (0.25,0.5] (0.5,0.75] (0.75,1]
cut_format(x, breaks, format_fun = scales::percent)
## [1] (0%, 25%] (25%, 50%] (25%, 50%] (50%, 75%] (75%, 100%]
## Levels: (0%, 25%] (25%, 50%] (50%, 75%] (75%, 100%]
Это все еще не идеально, передача количества разрывов (как в оригинальном примере) еще не работает.
Ответ 3
Используйте gsub
с некоторым регулярным выражением после умножения исходных данных на 100:
gsub("([0-9.]+)","\\1%",levels(cut(x*100,breaks=10)))
[1] "(0.449%,10.4%]" "(10.4%,20.3%]" "(20.3%,30.2%]" "(30.2%,40.2%]" "(40.2%,50.1%]" "(50.1%,60%]" "(60%,69.9%]" "(69.9%,79.9%]" "(79.9%,89.8%]" "(89.8%,99.7%]"
Ответ 4
Почему бы не скопировать код для cut.default
и создать свою собственную версию с измененными уровнями? См. этот смысл.
Были изменены две строки:
Строка 22: ch.br <- formatC(breaks, digits = dig, width = 1)
изменена на ch.br <- formatC(breaks*100, digits = dig, width = 1)
.
Строка 29: else "[", ch.br[-nb], ",", ch.br[-1L], if (right)
изменена на else "[", ch.br[-nb], "%, ", ch.br[-1L], "%", if (right)
Остальное одно и то же. И здесь он находится в действии:
library(devtools)
source_gist(4593967)
set.seed(1)
x <- runif(100)
levels(cut2(x, breaks=10))
# [1] "(1.24%, 11%]" "(11%, 20.9%]" "(20.9%, 30.7%]" "(30.7%, 40.5%]" "(40.5%, 50.3%]"
# [6] "(50.3%, 60.1%]" "(60.1%, 69.9%]" "(69.9%, 79.7%]" "(79.7%, 89.5%]" "(89.5%, 99.3%]"
Ответ 5
Новый ответ на старый вопрос.
Вы можете использовать аргумент label
для передачи функции для форматирования меток. Я буду использовать gsubfn
и scales::percent
library(gsubfn)
library(scales)
pcut <- function(x) gsubfn('\\d\\.\\d+', function(x) percent(as.numeric(x)),xx)
d <- data.frame(x=runif(100))
ggplot(d,aes(x=x,y=seq_along(x))) +
geom_point(aes(colour = cut(x, breaks = 10))) +
scale_colour_brewer(name = 'x', palette = 'Spectral', label = pcut)
![enter image description here]()