【问题标题】:Error in the seq() function in r?r 中的 seq() 函数出错?
【发布时间】:2016-12-18 15:43:03
【问题描述】:

我有一个非常奇怪的问题。
我通过计算生成了一个变量。然后我取了这个数字并创建了一个 +0.02、-0.02 范围(例如,Number= 7.74、UpperRange=7.76、LowerRange=7.72)。

之后我写了一个 for 循环,它应该检查 Number 是否在范围之间。答案必须最小为 1,因为 7,74 在 7.72-7.76 之间。
但答案是 FALSE。

但如果我检查 7.73 或 7.75 是否在范围内,答案是 TRUE。
它只会用特定的数字给我 TRUE 吗?为什么?

代码:

number= 7.74
upperRange = number + 0.02
lowerRange = number - 0.02
#
# This does not work!
# The length here is 1, but in real more than 1. For example purposes.
for(i in 1:length(number){
if(number[i] %in% seq(upperRange,lowerRange,0.01){
    print("Number is in the range")
}
else{
    print("Try again")
}
#
#
# But this works. When I change the number from 7.74 to 7.73, 7.75 or 7.76
number2 = 7.73
for(i in 1:length(number){
    if(number2[i] %in% seq(upperRange,lowerRange,0.01){
    print("Number2 is in the range")
}
else{
    print("Try again")
}

【问题讨论】:

  • 您在问题中给出的代码不可重现。除了在调用seq() 时混淆lowerRangeupperRange,正如manotheshark 所指出的,我发现6 个(!)右括号和大括号丢失了。
  • 这种不稳定的行为可能是由于使用带有双精度数字的%in% 时的舍入错误。不幸的是,我无法在我的机器上重现观察到的效果。请问,您能否尝试明确地对所有涉及的数字进行四舍五入,即round(number[i], 2) %in% round(seq(lowerRange, upperRange, 0.01), 2)

标签: r sequence seq


【解决方案1】:

您的 seq 参数顺序错误。使用以下任一

seq(upperRange,lowerRange,-0.01)

seq(lowerRange,upperRange,0.01)

尽管对于您要完成的工作,有更好的方法来检查一个数字是否介于两个数字之间。看看这个答案https://stackoverflow.com/a/41201517/3242130 以获取 between、findInterval 和逻辑比较的示例。

更新

您需要加载 dplyrdata.table 包或显式引用它们以使用 between 函数

dplyr::between(number, lowerRange, upperRange)
data.table::between(number, lowerRange, upperRange)

虽然如果您还没有使用这些软件包中的任何一个,我会坚持使用 base 中包含的内容

findInterval(number, lowerRange, upperRange)==1L
number>=lowerRange & number<=upperRange

【讨论】:

  • 非常感谢您的快速回答。我的 r 版本中不存在 between 函数。
  • 但是你给我的链接可以用不同的方式解决我的问题。非常感谢。
  • @Jupiter 介于 dplyrdata.table 包之间。答案已更新为示例。
  • 谢谢。我会尽量坚持你发布的基本方法。如果导致问题,我将使用您展示的“dplyr”和“data.table”包。最好的问候。
【解决方案2】:

常见问题 7.31

这是使用浮点数时的常见问题。

更多数据;看价值观——

    > number= 7.74
    > upperRange = number + 0.02
    > lowerRange = number - 0.02
    > print(number, digits = 20)
    [1] 7.7400000000000002
    > x <- seq(lowerRange, upperRange, by = 0.01)
    > print(x, digits = 20)
    [1] 7.7200000000000006 7.7300000000000004 7.7400000000000002 7.7500000000000009 7.7599999999999998
    > 

【讨论】:

  • 这解释了很多。谢谢你告诉我,确切的问题是什么。
  • @Jupiter 这不是您发布的代码有什么问题。浮点精度是为什么生成一个序列来检查一个数字是否在一个范围内是一个坏主意的原因之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多