base:cut() 可以始终如一地 return 小数吗?

Can base:cut() consistently return decimals?

不幸的是 cut() 似乎没有 return 具有给定小数位数的值(dig.lab 不能确保有尾随零),所以我只剩下“(2 , 2.1]" 当我想要 "(2.0, 2.1]".

我想更正这个问题,将第一个“2”替换为“2.0”,通常将任何整数 x 替换为“x”。后跟给定数量的零。

如果绝对必要,也许有人可以建议一个整数(不带小数)x 的正则表达式,这样我就可以自己替换它。

非常欢迎任何帮助。如果我遗漏了一些明显的东西,我们深表歉意。

您可以创建自己的函数,例如sprintf:

f <- function(fac, n){
  lapply(strsplit(levels(fac), ","), \(x) sprintf(paste0("%.",n,"f"), parse_number(x))) |>
    lapply(\(x) paste0("(", paste(x, collapse = ","), "]")) |>
    unlist()
}

cu <- cut(1:10, 3)
# [1] (0.991,4] (0.991,4] (0.991,4] (0.991,4] (4,7]     (4,7]     (4,7]     (7,10]    (7,10]   (7,10]   
# Levels: (0.991,4] (4,7] (7,10]

levels(cu) <- f(cu, 3)
# [1] (0.991,4.000]  (0.991,4.000]  (0.991,4.000]  (0.991,4.000]  (4.000,7.000]  (4.000,7.000]  (4.000,7.000]  (7.000,10.000] (7.000,10.000] (7.000,10.000]
# Levels: (0.991,4.000] (4.000,7.000] (7.000,10.000]

你可以使用我的 santoku 包:

library(santoku)

chop(rnorm(10), c(-1.55, 0, 1, 1.55), labels = lbl_intervals(fmt = "%.2f"))

 [1] [-1.75, -1.55) [0.00, 1.00)   [0.00, 1.00)   [0.00, 1.00)   [-1.75, -1.55)
 [6] [0.00, 1.00)   [1.00, 1.55)   [-1.55, 0.00)  [-1.55, 0.00)  [1.00, 1.55)  
Levels: [-1.75, -1.55) [-1.55, 0.00) [0.00, 1.00) [1.00, 1.55)

fmt 传递给 sprintf。或者您可以传入格式化函数,例如scales::label_number(...).