Подтвердить что ты не робот

Форматировать метки, создаваемые 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?

4b9b3361

Ответ 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