mi chiedevo quale dei tre metodi suggeriti (più un quarto) è il più veloce così ho fatto qualche analisi comparativa.
digitsum1 <- function(x) sum(as.numeric(unlist(strsplit(as.character(x), split = ""))))
digitsum2 <- function(x) sum(floor(x/10^(0:(nchar(x) - 1))) %% 10)
Utilizzando la funzione digitsBase dal pacchetto GLDEX:
library(GLDEX, quietly = TRUE)
digitsum3 <- function(x) sum(digitsBase(x, base = 10))
Sulla base di una funzione di Greg Neve nel R-help mailing list:
digitsum4 <- function(x) sum(x %/% 10^seq(0, length.out = nchar(x)) %% 10)
codice riferimento:
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
)
benchmark risultati:
#> 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
variante 2 è leggermente più veloce variante 1 mentre varianti 4 e 3 sono molto più lento. Anche se il codice della variante 4 sembra essere simile alla variante 2, la variante 4 è meno efficiente (ma comunque migliore della variante 3).
I risultati completi del benchmark (compresi i grafici) sono github.
Come ha detto DWin, non c'è quasi nessuna funzione per questa funzione se non negli angoli polverosi della teoria dei numeri. Non troverai neanche una funzione di prodotto a cifre. –