如何使用 `cut() 获得区间边界一致的小数点

问题描述 投票:0回答:1

在 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 仍然显示在间隔的小数点后第三位?

r format intervals cut
1个回答
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
将其格式化为一定数量的小数位。

© www.soinside.com 2019 - 2024. All rights reserved.