不同时间点小数点四舍五入

Rounding the decimal in different time points

我使用 rnorm 函数从标准正态分布生成了大小为 100 的样本。我想按照以下标准对数字进行四舍五入。 如果数字在 0 和 1 之间,它将四舍五入到小数点后 1 位。例如

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

如果一个数字大于 1,则它会四舍五入为:

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

你能指导我怎么做吗?

您可以使用以 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 在需要时将 TRUE/FALSE 视为 1/0,所以...

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

试试这个:

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

编辑: 或者一般来说:

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

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" 

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

round(x, abs(x) < 1)

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