1

假设我有一个长度为 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

首先,在某些情况下,预期结果向量太长。根据初始向量的长度,它的长度可以超过一个或两个元素。这似乎并不取决于数字有多大。在这些情况下, percentile() 向量的最后一个元素总是大于 100:

> percentile(v3)
   [1]   0.00000000   0.7374631   0.14749263   0.22123894   0.29498525
   .......
[1356]  99.92625369 100.0000000 100.07374631

我对浮点数/整数的处理是否有问题?如何改进我的功能,使其适用于任何长度的向量?任何帮助表示赞赏。

4

2 回答 2

3

是的,很可能是浮点问题。这应该这样做:

percentile <- function(N) seq(from = 0, to = 100, length.out = length(N))

确实:

length(v3)
# [1] 1357
length(percentile(v3))
# [1] 1357
于 2013-07-02T12:18:46.497 回答
2

看看seq。您可以指定所需序列的增量、间距或元素数量。举个简单的例子:

Rgames> seq(0,100,length=5)
[1]   0  25  50  75 100
Rgames> seq(0,100,length=37)
 [1]   0.000000   2.777778   5.555556   8.333333  11.111111  13.888889
 [7]  16.666667  19.444444  22.222222  25.000000  27.777778  30.555556
[13]  33.333333  36.111111  38.888889  41.666667  44.444444  47.222222
[19]  50.000000  52.777778  55.555556  58.333333  61.111111  63.888889
[25]  66.666667  69.444444  72.222222  75.000000  77.777778  80.555556
[31]  83.333333  86.111111  88.888889  91.666667  94.444444  97.222222
[37] 100.000000
于 2013-07-02T12:18:57.717 回答