假设我有一个长度为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
首先,预期结果向量在某些情况下太长。根据初始矢量的长度,其长度可以超过一个或两个元素。这似乎并不取决于数量有多大。在这些情况下,百分位数()向量的最后一个元素总是大于100:
> percentile(v3)
[1] 0.00000000 0.7374631 0.14749263 0.22123894 0.29498525
.......
[1356] 99.92625369 100.0000000 100.07374631
我对浮点数/整数的处理是否有些混乱?如何改进我的功能,以便它可以使用任何长度的向量?任何帮助表示赞赏。
答案 0 :(得分:3)
是的,很可能是浮点问题。这应该这样做:
percentile <- function(N) seq(from = 0, to = 100, length.out = length(N))
事实上:
length(v3)
# [1] 1357
length(percentile(v3))
# [1] 1357
答案 1 :(得分: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