我使用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
你能指导我怎么做吗?
答案 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"