長さ 5 のベクトルがあるとしましょう。内容は何でもかまいません。
> v1 <- c(0,0,0,0,0)
> length(v1)
[1] 5
そして、次のように、0 から 100 までの範囲の値が均等に分散された、同じ長さのベクトルを作成したいとします。
> v2 <- c(0,25,50,75,100)
> length(v2)
[1] 5
この例は非常に簡単ですが、任意の長さのベクトルに対してこれを実行できる関数を書きたいと思います。ここに私が書いたコードがあります:
percentile <- function(N) {
l <- length(N)
v <- 0
i = 0
while (as.integer(i) < 100) {
i = i + 100/(l - 1)
v <- c(v, i)
}
v
}
上記のベクター v1 で試してみると、期待どおりの結果が得られます。
> percentile(v1)
[1] 0 25 50 75 100
ただし、たとえば、長さ 1357 のベクトル v3 で試してみると、より「複雑な」長さの場合、事態は奇妙になります。
> v3 <- c(1:1357)
> length(v3)
[1] 1357
>
> length(percentile(v3))
[1] 1358
まず、期待される結果ベクトルが長すぎる場合があります。初期ベクトルの長さに応じて、その長さは最大で 1 つまたは 2 つの要素を超える場合があります。これは数の大きさには依存しないようです。これらの場合、percentile() ベクトルの最後の要素は常に 100 より大きくなります。
> percentile(v3)
[1] 0.00000000 0.7374631 0.14749263 0.22123894 0.29498525
.......
[1356] 99.92625369 100.0000000 100.07374631
フロート/整数の処理に何か問題がありますか? 任意の長さのベクトルで機能するように関数を改善するにはどうすればよいですか? どんな助けでも大歓迎です。