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 six
contiene números enteros! Para eso, useround
, como en la funciónis.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)