2016-05-26 9 views
0

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 

私はこれを行うことができますどのように私を導くことはできますか?

+0

abs((-1,1))と等しくない(-1,1)または(0,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 log10(abs(x)) < 0log10(abs(x)) >= 0、それがゼロ小数 に丸めます場合は、それが1つの小数

  • に丸めます場合は、それが必要なときに1/0のようなFALSE/TRUEとして扱い、そう...

  • 1

    これを試してみてください:

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

    EDIT:一般的に またはこれを:

    +0

    OPは "標準の正規分布からサンプル[...]を見ているので、おそらくabs(x)を使うべきです" – Frank

    +0

    私は 'x'の代わりに' abs(x) 'を使うことができましたが、私は与えられた基準に基づいてそれを管理する – 989

    1

    ifelse関数はこれを非常に簡単に行う必要があります。 @PierreLaFortuneコメントで述べたように、あなたがアトミックベクトルでタイプを混在させることはできませんので

    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をしたくない場合は、それから、それは困難です。

    ここ
    > 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) 
    

    丸めはテストabs(x) < 1で0と1の間を移動します。これは、1より小さいか、または間隔(-1、1)にある値に対して有効です。

    関連する問題