upper studio specify round number define decimals aproximar r integer rounding

studio - round upper in r



Verifica si el nĂºmero es entero (9)

Aquí hay una manera aparentemente confiable:

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 solución también permite números enteros en notación científica:

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

Me sorprendió saber que R no viene con una función práctica para verificar si el número es entero.

is.integer(66) # FALSE

Los archivos de ayuda advierten :

is.integer(x) no prueba si x contiene números enteros! Para eso, use round , como en la función is.wholenumber(x) en los ejemplos.

El ejemplo tiene esta función personalizada como una "solución alternativa"

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

Si tuviera que escribir una función para verificar los enteros, suponiendo que no hubiera leído los comentarios anteriores, escribiría una función que iría algo en la línea de

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

¿Dónde fallaría mi enfoque? ¿Cuál sería tu trabajo si estuvieras en mis zapatos hipotéticos?


Aquí hay una solución que usa funciones más simples y sin cortes:

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

Lo que es más, puedes probar un vector completo a la vez, si lo deseas. Aquí hay una función:

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

Puede cambiarlo para usar *apply en el caso de vectores, matrices, etc.


De Hmisc::spss.get :

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

opción mucho más segura, en mi humilde opinión, ya que "pasa por alto" el problema de precisión de la máquina. Si prueba is.integer(floor(1)) , obtendrá FALSE . Por cierto, su número entero no se guardará como un número entero si es más grande que el valor .Machine$integer.max , que es, por defecto 2147483647, por lo tanto, cambie el valor integer.max , o haga las comprobaciones alternativas ...


En R, si un número es numérico o entero puede ser determinado por la función de clase. En general, todos los números se almacenan como numéricos y para definir explícitamente un número como número entero, necesitamos especificar ''L'' después del número.

Ejemplo:

x <- 1

clase (x)

[1] "numérico"

x <- 1L

clase (x)

[1] "entero"

Espero que esto sea lo que se necesitaba. Gracias :)


Lectura de la documentación del lenguaje R, as.integer tiene más que ver con la forma en que se almacena el número que si es prácticamente equivalente a un número entero. is.integer prueba si el número se declara como un número entero. Puedes declarar un entero poniendo una L después de él.

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

También funciones como round devolverán un entero declarado, que es lo que estás haciendo con x==round(x) . El problema con este enfoque es lo que consideras que es prácticamente un número entero. El ejemplo usa menos precisión para probar la equivalencia.

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

Entonces, dependiendo de su aplicación, podría tener problemas de esa manera.


No estoy seguro de lo que estás tratando de lograr. Pero aquí hay algunos pensamientos:
1. Convertir a entero:
num = as.integer(123.2342)
2. Compruebe si una variable es un número entero:
is.integer(num)
typeof(num)=="integer"


Otra alternativa es verificar la parte fraccional:

x%%1==0,

o,

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

si quiere verificar dentro de cierta tolerancia.


Parece que no ve la necesidad de incorporar alguna tolerancia a los errores. No sería necesario si todos los enteros entraran como enteros, sin embargo, a veces provienen de operaciones aritméticas que pierden cierta precisión. Por ejemplo:

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

Tenga en cuenta que esta no es la debilidad de R, todos los programas informáticos tienen algunos límites de precisión.


puedes usar una condición simple como:

if(round(var) != var)­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­