使用rep()会导致向量短于“times”参数

问题描述 投票:0回答:1

我正在一个循环中工作,我需要将字符串复制一定次数。当我完成循环时,复制的次数需要增加,并且我正在从向量中提取该值。我的循环陷入了迭代,其中“ES”需要复制 56 次,因为 rep() 函数只复制它 55 次。这是一项更大任务的一部分,但我已将其精简为仅失败的部分。

在解决此问题时,我发现只有当我需要从百分比向量引用“ES”复制的次数时才会发生这种情况。如果我指定 x 作为值本身,它可以正常工作,并生成完整的 56 长度向量。但是当从序列中拉出 x 时,它只产生一个 55 长度的向量。

# This produces a 56-length vector
x <- 0.14
y <- 400
test <- rep("ES",times=x*y)  
length(test)
class(x)
  
# This produces a 55-length vector
x <- seq(0.02,0.50,0.02)[7]
y <- 400
rep("ES",times=x*y)
length(test)
class(x)

变量 x 在这两个实例中都属于“numeric”类。经过大量测试后,我发现唯一有效的方法是将 x 转换为字符,然后再次将其转换回数字。

i <- seq(0.02,0.50,0.02)
x <- as.character(i[7])
x <- as.numeric(x)
y <- 400
rep("ES",times=x*y)

谁能解释为什么会发生这种情况?

r
1个回答
0
投票

这是R,为了那些不会猜测的人的利益。

问题在于

x*y
不是整数,因为浮点运算并不精确。 帮助页面 (
?rep
) 介绍了
times
参数

一个整数值向量,给出(非负)次数 如果长度为 length(x),则重复每个元素,或者重复整个元素 向量 if 的长度为 1。负值或 NA 值是错误的。一个双人 接受向量,其他输入被强制为整数或双精度 矢量。

我们看到了

> x <- seq(0.02,0.50,0.02)[7]
> y <- 400
> x*y
[1] 56
> x*y-56
[1] -7.105427e-15
> as.integer(x*y)
[1] 55

所以:55。

可以做你想做的事情:

rep("ES", times=round(x*y))

或者在

seq
中使用整数,如果你知道一切都是整数倍

> i<-seq(1, 25)
> x <- as.character(i[7])
> x <- as.numeric(x)
> y <- 400
> as.integer(x*y/50)
[1] 56
© www.soinside.com 2019 - 2024. All rights reserved.