代码之家  ›  专栏  ›  技术社区  ›  Roman LuÅ¡trik

检查数字是否为整数

  •  83
  • Roman LuÅ¡trik  · 技术社区  · 14 年前

    我很惊讶地发现r没有一个方便的函数来检查数字是否是整数。

    is.integer(66) # FALSE
    

    这个 help files warns :

    is.integer(x) 不测试如果 x 包含整数!为此, 使用 round ,在函数中 is.wholenumber(x) 在例子中。

    该示例具有此自定义函数作为“解决方法”

    is.wholenumber <- function(x, tol = .Machine$double.eps^0.5)  abs(x - round(x)) < tol
    is.wholenumber(1) # is TRUE
    

    如果我必须编写一个函数来检查整数,假设我没有阅读上面的注释,我将编写一个函数,它将沿着

    check.integer <- function(x) {
        x == round(x)
    }
    

    我的方法在哪里会失败?如果你穿着我的假想鞋,你会做什么?

    9 回复  |  直到 6 年前
        1
  •  99
  •   James    9 年前

    另一种选择是检查分数部分:

    x%%1==0,
    

    或者,

    min(abs(c(x%%1, x%%1-1))) < tol,
    

    如果你想在一定的公差范围内检查。

        2
  •  27
  •   Iterator    13 年前

    下面是一个使用更简单的函数和无黑客的解决方案:

    all.equal(a, as.integer(a))
    

    此外,如果你愿意的话,你可以一次测试整个向量。这是一个函数:

    testInteger <- function(x){
      test <- all.equal(x, as.integer(x), check.attributes = FALSE)
      if(test == TRUE){ return(TRUE) }
      else { return(FALSE) }
    }
    

    你可以把它改成 *apply 对于向量、矩阵等。

        3
  •  9
  •   VitoshKa    9 年前

    这里有一个显然可靠的方法:

    check.integer <- function(N){
        !grepl("[^[:digit:]]", format(N,  digits = 20, scientific = FALSE))
    }
    
    check.integer(3243)
    #TRUE
    check.integer(3243.34)
    #FALSE
    check.integer("sdfds")
    #FALSE
    

    此解决方案还允许使用科学记数法计算整数:

    > check.integer(222e3)
    [1] TRUE
    
        4
  •  9
  •   Andrew Redd    8 年前

    阅读R语言文档, as.integer 与数字实际上等于整数相比,它更多地与数字的存储方式有关。 is.integer 测试数字是否声明为整数。可以通过将 L 之后。

    > is.integer(66L)
    [1] TRUE
    > is.integer(66)
    [1] FALSE
    

    也可以像 round 将返回一个声明的整数,这正是您要使用的 x==round(x) . 这种方法的问题在于您实际上认为它是一个整数。该示例在测试等效性时使用的精度较低。

    > is.wholenumber(1+2^-50)
    [1] TRUE
    > check.integer(1+2^-50)
    [1] FALSE
    

    因此,根据您的应用程序,您可能会遇到这样的问题。

        5
  •  8
  •   Aniko    14 年前

    似乎您不认为需要合并一些误差容限。如果所有的整数都是以整数的形式输入的,则不需要这样做,但是有时它们是由于算术运算的结果而失去了某些精度。例如:

    > 2/49*49
    [1] 2
    > check.integer(2/49*49)
    [1] FALSE 
    > is.wholenumber(2/49*49)
    [1] TRUE
    

    注意,这不是R的弱点,所有的计算机软件都有一定的精度限制。

        6
  •  6
  •   aL3xa    14 年前

    Hmisc::spss.get :

    all(floor(x) == x, na.rm = TRUE)
    

    更安全的选择,imho,因为它“绕过”了机器的精度问题。如果你尝试 is.integer(floor(1)) 你会得到 FALSE . 另外,如果您的整数大于 .Machine$integer.max 值,默认值为2147483647,因此可以更改 integer.max 值,或进行其他检查…

        7
  •  3
  •   ɢʀᴜɴᴛ    7 年前

    您可以使用简单的if条件,例如:

    if(round(var) != var)­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
    
        8
  •  1
  •   Meenansha Sachdeva    7 年前

    在r中,一个数字是数字还是整数可以由类函数决定。通常,所有数字都存储为数字,要将数字显式定义为整数,我们需要在数字后指定“l”。

    例子:

    x & lt;- 1

    类(x)

    〔1〕“数字”

    x和lt;-1L

    类(x)

    〔1〕“整数”

    我希望这是需要的。谢谢)

        9
  •  -3
  •   bernardw    14 年前

    我不知道你想做什么。但这里有一些想法: < BR> 1。转换为整数: < BR> num=as.integer(123.2342) < /代码> < BR> 2。检查变量是否为整数: < BR> <代码> 是.integer(num)
    typeof(num)=“integer”

    但这里有一些想法:
    1。转换为整数:
    num = as.integer(123.2342)
    2。检查变量是否为整数:
    是整数(num)
    typeof(num)=“整数”