2016-05-26 27 views
0

我使用rnorm函数从标准正态分布生成了一个大小为100的样本。我想按照以下标准对数字进行四舍五入。 如果数字在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

您的意思是(-1,1)或(0,1)不等于abs((-1,1))?由于正态分布产生正数和负数,所以我不太确定。 – lmo

回答

5

可以使用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,它会向零小数
1

试试这个:

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

编辑:一般 或本:

+0

您的标准应该使用abs(x),可能是因为OP正在查看“来自标准正态分布的样本” – Frank

+0

我可以用'abs(x)'代替'x',但是我设法根据给定的标准做出决定 – 989

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" 
3

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

round(x, abs(x) < 1) 

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