Функция суммы цифр в R

Я искал довольно элементарную цифровую функцию цифра sum в R.

  • Я не нашел предустановленную функцию.
  • Даже в Stackoverflow's обширная библиотека R Я не нашел запись.

Поэтому я попробовал себя, заканчивая следующей функцией:

# Function to calculate a digit sum
digitsum = function (x) {sum(as.numeric(unlist(strsplit(as.character(x), split="")))) }

Я работаю, но я все еще борюсь со следующими двумя вопросами:

  • Действительно ли в простой R нет функции для суммы цифр?
  • Есть ли более умный способ кодирования этой функции?

Ответ 1

Это должно быть лучше:

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

Ответ 2

Я задавался вопросом, какой из трех предложенных методов (плюс четвертый) является самым быстрым, поэтому я сделал некоторый бенчмаркинг.

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

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

  • Использование функции digitsBase из пакета GLDEX:

    library(GLDEX, quietly = TRUE)
    digitsum3 <-  function(x) sum(digitsBase(x, base = 10))
    
  • Основываясь на функции Грега Снега в списке рассылки R-help:

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

Код контрольной точки:

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
)

Результаты тестов:

#> 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

Вариант 2 немного быстрее, чем вариант 1, тогда как варианты 4 и 3 намного медленнее. Хотя код варианта 4, по-видимому, аналогичен варианту 2, вариант 4 менее эффективен (но все же лучше, чем вариант 3).

Результаты полного теста (включая графики) находятся на github.

Ответ 3

Я не уверен, почему вы думаете, что для этого будет встроенная функция. Это не статистическая операция. Больше процедуры теории чисел. (Существует много примеров, которые можно найти при поиске архивов Rhelp. Я использую Markmail для этой цели, но есть и другие поисковые системы например RSeek, GMane и веб-страницу Newcastle. Ваша функция будет принимать ряд чисел и возвращать единый номер, который был бы цифрой суммы всех из них. Если бы это была цель, то она выглядела разумно спроектированной.Я бы предположил, что один хотел бы получить суммы цифр от каждого числа:

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

В pkg: GLDEX есть "оцифровка" funciton digitsBase, и вы можете заменить свой as.numeric(unlist (split (as.character(x), ""))) с помощью этой функции:

digitsBase(x, 10)

Ответ 4

Что я делаю для нахождения суммы цифр в R:

x = readline("Enter the number")
a = as.integer(c(strsplit(x,split="")[[1]]))
print((sum(a)))