1

Rのパーセンテージを処理しようとしていますが、奇妙な問題が発生しています。ベクトルの値をベクトルのパーセンテージに変換すると、合計sumが1にならないことがよくあります。

最小限の例:

data <- rnorm(1000)*100
max <- 50
unlist(lapply(0:(1000/max-1), 
     function(i) 
        sum(
            data[(i*max+1):(i*(max+1))]
            /
            sum(data[(i*max+1):(i*(max+1))])
           )
        ))-1 

それはゼロのベクトルを与えるはずです、しかし私はこれを得ています:

[1]  0.000000e+00  0.000000e+00 -1.110223e-16 -1.110223e-16  0.000000e+00 -1.110223e-16  0.000000e+00  0.000000e+00  0.000000e+00
[10]  0.000000e+00  0.000000e+00  2.220446e-16  0.000000e+00 -4.440892e-16  0.000000e+00  0.000000e+00  0.000000e+00  4.440892e-16
[19] -1.110223e-16  0.000000e+00

治療法のアイデアはありますか?

4

2 に答える 2

4

もっと重要な質問は、なぜこれらが必要だと思います0か?

浮動小数点演算を使用しており、すべての数値をコンピューターで正確に表すことができるわけではありません。これは、現象を説明するR FAQ 7.31でカバーされています(または関連しています) 。

無視することもできます(すべての目的と目的で、これらの値は0

> all.equal(tmp, rep(0, length(tmp))) ## tmp contain your numbers
[1] TRUE

またはあなたの特定の操作に応じてそれに対処することを学びます。1つの方法は、それらをある程度丸めることです。

> round(tmp, 2)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 3)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 4)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 5)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

しかし、それはあなたがこれらの数字で何をしたいかに依存します。

于 2012-10-24T15:38:59.060 に答える
4

それらはわずかな数だけずれています。浮動小数点演算に固有のこれらの重要でない違いの表示方法を変更したい場合は、format 関数または sprintf や formatC などのそのいとこを使用できます。これは実際にはFAQ 7.31 のインスタンスです。フォーマットに関するヘルプが必要な場合は、特定のアプリケーションについて説明する必要があります。強制的にゼロを表示させたい場合は、 round() も使用できます

round( unlist(lapply(0:(1000/max-1), 
 function(i) 
    sum(
        data[(i*max+1):(i*(max+1))]
        /
        sum(data[(i*max+1):(i*(max+1))])
       )
    ))-1  , digits=4)
于 2012-10-24T15:35:18.947 に答える