正如@user20650 所说,labels= 将允许您手动执行此操作(为此,这是Adding labels to cut function in R 的欺骗问题)。
如果您想要一种编程方式将级别转换为这种 SI(或 IEC)格式,我们可以借鉴 utils:::format.object_size 并定义我们自己的函数:
#' Kilo, Mega, Giga
#'
#' Convert numbers to SI or IEC format.
#'
#' @param x numeric
#' @param standard one of "SI" (1000-based) or "IEC" (1024)
#' @param digits number of significant digits to round to
#' @param sep character, what to put between the number and the letter
#' @param suffix character what to put immediately after the K/M/G
#' (e.g., "b" or "B")
#' @return character
#' @export
KMG <- function(x, standard = "SI", digits = 1L, sep = "", suffix = "") {
known_bases <- c(legacy = 1024, IEC = 1024, SI = 1000)
known_units <- list(SI = c("", "k", "M", "G", "T", "P",
"E", "Z", "Y"), IEC = c("", "Ki", "Mi", "Gi",
"Ti", "Pi", "Ei", "Zi", "Yi"), legacy = c("", "K",
"M", "G", "T", "P"))
standard <- match.arg(standard, c("auto", names(known_bases)))
if (is.null(digits))
digits <- 1L
base <- known_bases[[standard]]
units_map <- known_units[[standard]]
powers <- rep(0L, length(x))
powers[x > 0] <- pmin(as.integer(log(x[x > 0], base = base)), length(units_map) - 1L)
units <- paste0(units_map[powers + 1L], suffix)
paste(round(x/base^powers, digits = digits), units, sep = sep)
}
(编辑以矢量化函数并删除"LEGACY",并添加suffix= 参数。)
它的用途:
x <- c(1e6,2e6,500e3,10e6,233e3,50e3)
cuts <- cut(x, c(0,250e3,500e3,1e6,2.5e6,99e6), dig.lab=10)
lvls <- levels(cuts)
lvls
# [1] "(0,250000]" "(250000,500000]" "(500000,1000000]" "(1000000,2500000]" "(2500000,99000000]"
gre <- gregexpr("[[:digit:].]+", lvls)
regmatches(lvls, gre) <-
lapply(regmatches(lvls, gre), function(lvl) KMG(as.numeric(lvl)))
lvls
# [1] "(0,250k]" "(250k,500k]" "(500k,1M]" "(1M,2.5M]" "(2.5M,99M]"
levels(cuts) <- lvls
cuts
# [1] (500k,1M] (1M,2.5M] (250k,500k] (2.5M,99M] (0,250k] (0,250k]
# Levels: (0,250k] (250k,500k] (500k,1M] (1M,2.5M] (2.5M,99M]