在不同的时间点舍入小数点

时间:2016-05-26 15:10:24

标签: r rounding distribution

我使用rnorm函数从标准正态分布生成了大小为100的样本。我想按照标准对数字进行舍入。 如果number介于0和1之间,则将以1小数点舍入。 e.g

0.123 -> 0.1
0.456 -> 0.5
0.98 -> 1

如果数字大于1,那么它将舍入为:

2.34 -> 2
4.98 -> 5
4.4 -> 4

你能指导我怎么做吗?

4 个答案:

答案 0 :(得分:5)

您可以使用base-10日志设置舍入级别:

set.seed(1); x = rnorm(100) # example
y = round(x, log10(abs(x)) < 0)

head(cbind(x,y)) # check results

              x    y
[1,] -0.6264538 -0.6
[2,]  0.1836433  0.2
[3,] -0.8356286 -0.8
[4,]  1.5952808  2.0
[5,]  0.3295078  0.3
[6,] -0.8204684 -0.8

它是如何工作的。 R在需要的时候像1/0一样对待TRUE / FALSE,所以......

  • log10(abs(x)) < 0时,它将舍入到一位小数
  • log10(abs(x)) >= 0时,它将舍入到零小数

答案 1 :(得分:3)

这是@Franks解决方案的另一个启发:

round(x, abs(x) < 1)

使用测试abs(x) < 1,舍入将在0和1之间移动。这适用于幅度小于1或在区间(-1,1)中的值。

答案 2 :(得分:1)

试试这个:

ifelse(x>=0 & x<=1, round(x, 1), round(x))

编辑: 或者一般来说:

ifelse(abs(x)<1, round(x, 1), round(x))

答案 3 :(得分:1)

ifelse函数应该很容易实现。

x <- c(0.123, 0.456, 0.98, 2.34, 4.98, 4.4)
ifelse(abs(x) < 1.0, round(x, 1), round(x, 0))
[1] 0.1 0.5 1.0 2.0 5.0 4.0

但是,如果你不想在整数之后得到小数x.0,那么就像评论中提到的@PierreLaFortune一样,它更难,因为你不能在原子向量中混合类型。就像他说的那样,你可以强迫一个角色:

> as.character(ifelse(x <= 1.0, round(x, 1), round(x, 0)))
[1] "0.1" "0.5" "1"   "2"   "5"   "4"