在 R 中使用
cut()
时如何获得一致的区间界限格式?
例如,以下间隔边界格式将在 2 到 5 个小数点之间变化。
# Sample data
set.seed(1)
data <- runif(600, -1, 1.5)
intervals <- 15
# Create intervals with three decimal points
intervals <- cut(data, seq.int(min(data), max(data), length.out = intervals+1), include.lowest = TRUE)
# Display the intervals
intervals
我想要的是间隔边界格式与小数点后三位一致。我得到的最接近的是引入带有 3 个小数点的四舍五入分隔符:
rounded_breaks <- round(
seq(min(data), max(data), length.out = intervals + 1),
3)
intervals <- cut(data, breaks = rounded_breaks, include.lowest = TRUE)
虽然
rounded_breaks
保存具有 3 位小数点的值,但 cut()
如果它是 0,则似乎会删除第三位小数点,因此将边界的格式呈现为 2 位小数。
如何调整才能使 0 仍然显示在间隔的小数点后第三位?
您可以提取标签中的数字并重新格式化。这是一种方法来做到这一点
m <- gregexpr(r"{-?\d+\.\d+}", levels(intervals))
nums <- regmatches(levels(intervals), m)
regmatches(levels(intervals), m) <- lapply(nums, \(x) sprintf("%0.3f", as.numeric(x)))
levels(intervals)
# [1] "[-0.995,-0.830]" "(-0.830,-0.664]" "(-0.664,-0.498]" "(-0.498,-0.333]"
# [5] "(-0.333,-0.167]" "(-0.167,-0.001]" "(-0.001,0.165]" "(0.165,0.330]"
# [9] "(0.330,0.496]" "(0.496,0.662]" "(0.662,0.827]" "(0.827,0.993]"
# [13] "(0.993,1.160]" "(1.160,1.320]" "(1.320,1.490]"
我们使用正则表达式查找标签中的数字,并使用
sprintf
将其格式化为一定数量的小数位。