不同时间点小数点四舍五入
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) 内的值。
我使用 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) 内的值。