Verifique se o número é inteiro

Fiquei surpreso ao saber que R não vem com uma function útil para verificar se o número é inteiro.

is.integer(66) # FALSE 

Os arquivos de ajuda avisam :

is.integer(x) não testa se x contém números inteiros! Para isso, use round , como na function is.wholenumber(x) nos exemplos.

O exemplo tem essa function personalizada como uma “solução alternativa”

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

Se eu tivesse que escrever uma function para verificar números inteiros, supondo que eu não tivesse lido os comentários acima, eu escreveria uma function que seria algo nos moldes de

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

Onde minha abordagem falharia? Qual seria o seu trabalho se você estivesse no meu tênis hipotético?

Outra alternativa é verificar a parte fracionária:

 x%%1==0, 

ou,

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

se você quiser verificar dentro de uma certa tolerância.

Aqui está uma solução usando funções mais simples e sem hacks:

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

Além disso, você pode testar um vetor inteiro de uma só vez, se desejar. Aqui está uma function:

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

Você pode alterá-lo para usar *apply no caso de vetores, matrizes, etc.

Aqui está uma maneira aparentemente confiável:

 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 

Esta solução também permite inteiros em notação científica:

 > check.integer(222e3) [1] TRUE 

Lendo a documentação da linguagem R, as.integer tem mais a ver com como o número é armazenado do que se é praticamente equivalente a um inteiro. is.integer testa se o número é declarado como um inteiro. Você pode declarar um inteiro colocando um L depois dele.

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

Também funções como round retornarão um inteiro declarado, que é o que você está fazendo com x==round(x) . O problema com essa abordagem é o que você considera praticamente um inteiro. O exemplo usa menos precisão para testar a equivalência.

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

Então, dependendo da sua aplicação, você pode ter problemas assim.

Parece que você não vê a necessidade de incorporar alguma tolerância a erros. Não seria necessário se todos os inteiros entrassem como números inteiros, porém às vezes eles vêm como resultado de operações aritméticas que perdem alguma precisão. Por exemplo:

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

Note que esta não é a fraqueza de R, todo software de computador tem alguns limites de precisão.

De Hmisc::spss.get :

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

opção muito mais segura, IMHO, uma vez que “ignora” o problema de precisão da máquina. Se você tentar is.integer(floor(1)) , você receberá FALSE . BTW, seu inteiro não será salvo como inteiro se for maior que o valor .Machine$integer.max , que é, por padrão, 2147483647, portanto, altere o valor integer.max ou faça as verificações alternativas …

você pode usar simples se condição como:

 if(round(var) != var) 

Em R, se um número é numérico ou inteiro, pode ser determinado pela function de class. Geralmente, todos os números são armazenados como numéricos e para definir explicitamente um número como inteiro, precisamos especificar ‘L’ após o número.

Exemplo:

x <- 1

class (x)

[1] “numérico”

x <- 1L

class (x)

[1] “inteiro”

Espero que isso seja o necessário. Obrigado 🙂

Não tenho certeza do que você está tentando realizar. Mas aqui estão alguns pensamentos:
1. Converter em inteiro:
num = as.integer(123.2342)
2. Verifique se uma variável é um inteiro:
is.integer(num)
typeof(num)=="integer"