Saltar al contenido

Función de suma de dígitos en R

Agradeceríamos tu apoyo para compartir nuestras reseñas con relación a las ciencias informáticas.

Solución:

Esto debería ser mejor:

digitsum <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)

Me preguntaba cuál de los tres métodos sugeridos (más un cuarto) es el más rápido, así que hice algunas pruebas comparativas.

  1. digitsum1 <- function(x) sum(as.numeric(unlist(strsplit(as.character(x), split = ""))))

  2. digitsum2 <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)

  3. Usando la función digitsBase del paquete GLDEX:

    library(GLDEX, quietly = TRUE)
    digitsum3 <-  function(x) sum(digitsBase(x, base = 10))
    
  4. Basado en una función de Greg Snow en la lista de correo de R-help:

    digitsum4 <- function(x) sum(x %/% 10^seq(0, length.out = nchar(x)) %% 10)

Código de referencia:

library(microbenchmark, quietly = TRUE)
# define check function
my_check <- function(values) 
  all(sapply(values[-1], function(x) identical(values[[1]], x)))

x <- 1001L:2000L
microbenchmark(
  sapply(x, digitsum1),
  sapply(x, digitsum2),
  sapply(x, digitsum3),
  sapply(x, digitsum4),
  times = 100L, check = my_check
)

Resultados de los puntos de referencia:

#> Unit: milliseconds
#>                  expr   min    lq  mean median    uq   max neval
#>  sapply(x, digitsum1)  3.41  3.59  3.86   3.68  3.89  5.49   100
#>  sapply(x, digitsum2)  3.00  3.19  3.41   3.25  3.34  4.83   100
#>  sapply(x, digitsum3) 15.07 15.85 16.59  16.22 17.09 24.89   100
#>  sapply(x, digitsum4)  9.76 10.29 11.18  10.56 11.48 45.20   100

La variante 2 es ligeramente más rápida que la variante 1, mientras que las variantes 4 y 3 son mucho más lentas. Aunque el código de la variante 4 parece ser similar al de la variante 2, la variante 4 es menos eficiente (pero aún mejor que la variante 3).

Los resultados de referencia completos (incluidos los gráficos) están en github.

No estoy seguro de por qué pensarías que habría una función incorporada para hacer eso. No es realmente una operación estadística. Más de un tipo de teoría de números de procedimiento. (Hay muchos ejemplos que se pueden encontrar con una búsqueda en Rhelp Archives. Uso Markmail para ese propósito, pero hay otros motores de búsqueda como RSeek, GMane y la página web de Newcastle. Su función tomaría una serie de números y devolvería un solo número que era la suma de dígitos de todos ellos. Si ese fuera el objetivo, entonces parece razonablemente diseñado. Hubiera adivinado que uno querría las sumas de dígitos de cada número:

sapply( c(1,2,123), 
        function(x) sum( as.numeric(unlist(strsplit(as.character(x), split=""))) ))
[1] 1 2 6

Hay una función de "digitalización" digitsBase en pkg:GLDEX, y puede reemplazar su as.numeric(unlist(split(as.character(x),""))) con esa función:

digitsBase(x, 10)

valoraciones y reseñas

Puedes reafirmar nuestra misión mostrando un comentario o dejando una valoración te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *