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(...)
.
不幸的是 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(...)
.