如何根据固定的间隔对数字进行舍入

时间:2012-08-17 15:11:53

标签: r

  

可能重复:
  R round to nearest .5 or .1
  How do I round to 1, 1.5, 2 etc instead of 1, 2 or 1.1, 1.2, 1.3 in R?

如果我想用逗号后的某些数字对数字进行舍入

a <- 2.1357

我可以用

round(a, 1)

获得2.1作为结果。

现在让我有一组数字,如

b <- rnorm(n = 10, mean = .5, sd = .1)
> b
[1] 0.5554950 0.4527671 0.5217543 0.6137458 0.6023219 0.7045009 0.5140363 0.5312920
[9] 0.5841152 0.4492901

如果我想对这些数字进行舍入以便使它们成为0.1的倍数,那么输入就足够了

round(b, 1)

现在我的问题是:如果我想围绕它们以使... 0.2 的倍数怎么办?或 0.3 ?或 0.25 ...等等?

谢谢,

3 个答案:

答案 0 :(得分:5)

a <- runif(20)  # Data
mult <- .125    # Multiple
mult*round(a/mult)

让你

 [1] 0.250 0.750 0.125 0.625 0.000 0.500 0.125 0.500 0.125 0.875 1.000 0.750
[13] 0.500 0.500 0.125 0.500 0.250 0.250 0.250 0.875

答案 1 :(得分:3)

这会有帮助吗

b <- rnorm(n = 10, mean = .5, sd = .1) 
b
library(plyr)
round_any(b, 0.1)

答案 2 :(得分:2)

@Backlin提供的答案是最简单的方法,但请注意,如果您关心最终结果的分布,您必须仔细考虑如何绘制样本。例如,以下是使用简单方法从随机统一中抽取100万的结果:

> a <- runif(1000000)
> mult <- 0.125
> samp <- mult * round(a/mult) 
> table(samp)

samp
     0  0.125   0.25  0.375    0.5  0.625   0.75  0.875      1 
 62889 125172 124564 125096 125443 124716 124899 124988  62233 

请注意,即使原始数据来自统一的[0,1]分布,0和1在舍入分布的分布中也不足。如果你真的想要[0,1]之间以0.125为增量的均匀随机样本,我会使用sampleseq

> rng <- seq(0, 1, 0.125)
> samp <- sample(rng, 1000000, replace=TRUE)
> table(samp)
samp
     0  0.125   0.25  0.375    0.5  0.625   0.75  0.875      1 
111206 111209 111222 110972 110617 111200 110827 111199 111548

这就是我建议你从统一分布中得出的方法。如果要对可能的结果赋予不同的权重,可以使用prob参数sample。 如果您想要从不具有明确定义的上限和下限的不同分布中绘制,例如正态分布,您可能会或可能不会遇到类似的问题。您需要仔细考虑并运行许多测试,以确保获得所需的分发。