检查数字是否是整数
我很惊讶得知R没有提供一个方便的函数来检查数字是否是整数。
is.integer(66) # FALSE
帮助文件警告 :
is.integer(x)
不testingx
包含整数! 为此,请使用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) }
我的方法会在哪里失败? 如果你在我的假设鞋子里,你的工作会是什么?
另一种方法是检查小数部分:
x%%1==0,
要么,
min(abs(c(x%%1, x%%1-1))) < tol,
如果你想检查一定的宽容。
这里有一个解决scheme,使用更简单的function,没有黑客:
all.equal(a, as.integer(a))
而且,如果你愿意的话,你可以一次testing一个完整的vector。 这是一个function:
testInteger <- function(x){ test <- all.equal(x, as.integer(x), check.attributes = FALSE) if(test == TRUE){ return(TRUE) } else { return(FALSE) } }
你可以改变它来使用*apply
于vector,matrix等
这是一个明显可靠的方法:
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
该解决scheme还允许以科学记数法的整数:
> check.integer(222e3) [1] TRUE
看来,你没有看到需要纳入一些容错。 如果所有整数都以整数formsinput,则不需要,但是有时它们是由于算术运算的结果而失去一些精确性。 例如:
> 2/49*49 [1] 2 > check.integer(2/49*49) [1] FALSE > is.wholenumber(2/49*49) [1] TRUE
请注意,这不是R的弱点,所有的计算机软件都有一定的精度限制。
阅读R语言文档, as.integer
与存储数字的方式有关,如果它实际上相当于一个整数。 is.integer
testing数字是否被声明为整数。 你可以通过在它后面加一个L
来声明一个整数。
> is.integer(66L) [1] TRUE > is.integer(66) [1] FALSE
像round
这样的函数将返回一个声明的整数,这就是你正在做的x==round(x)
。 这种方法的问题是你认为实际上是一个整数。 该示例使用较低的精度来testing等价性。
> is.wholenumber(1+2^-50) [1] TRUE > check.integer(1+2^-50) [1] FALSE
所以根据你的应用程序,你可能会遇到麻烦。
来自Hmisc::spss.get
:
all(floor(x) == x, na.rm = TRUE)
更安全的select,恕我直言,因为它“绕过”机器精度问题。 如果你尝试is.integer(floor(1))
,你会得到FALSE
。 顺便说一句,你的整数不会被保存为整数,如果它大于.Machine$integer.max
值,这是默认2147483647,所以要么改变integer.max
值,或做替代检查…
在R中,一个数字是数字还是整数都可以通过类函数来确定。 一般来说,所有的数字都以数字的forms存储,并且明确地定义一个数字作为整数,我们需要在数字之后指定“L”。
例:
x < – 1
类(x)的
[1]“数字”
x < – 1L
类(x)的
[1]“整数”
我希望这是需要的。 谢谢 :)
你可以使用简单的条件,如:
if(round(var) != var)
我不知道你在做什么。 但是这里有一些想法:
1.转换为整数:
num = as.integer(123.2342)
2.检查一个variables是否是一个整数:
is.integer(num)
typeof(num)=="integer"