R中的数字和函数

use*_*503 10 r

我正在寻找R中相当基本的数字函数数字和.

  • 我没有找到预装的功能.
  • 即使在Stackoverflow广泛的R库中,我也没有找到记录.

因此我试着用以下功能结束:

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

我工作,但我仍然在努力解决两个问题:

  1. 是否真的在普通R中没有数字和的功能?
  2. 是否有更智能的方法来编写此功能?

Jul*_*ora 16

这应该更好:

digitsum <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)
Run Code Online (Sandbox Code Playgroud)

  • +1哇。这是超级聪明。喜欢这种方式。 (2认同)

Uwe*_*Uwe 6

我想知道三种建议方法中的哪一种(加上第四种方法)是最快的,所以我做了一些基准测试.

  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. 使用包GLDEX中的函数digitsBase:

    library(GLDEX, quietly = TRUE)
    digitsum3 <-  function(x) sum(digitsBase(x, base = 10))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 基于Greg Snow在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
)
Run Code Online (Sandbox Code Playgroud)

基准测试结果:

#> 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
Run Code Online (Sandbox Code Playgroud)

变体2比变体1略快,而变体4和3慢得多.虽然变体4的代码似乎与变体2类似,但变体4的效率较低(但仍然优于变体3).

完整的基准测试结果(包括图表)在github上.