13

Rで非常に基本的な数値関数の桁の合計を探していました.

  • プリインストール機能が見つかりませんでした。
  • Stackoverflow の広範な R ライブラリでも、記録は見つかりませんでした。

したがって、次の関数で終了しようとしました:

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

私は動作しますが、次の 2 つの質問にまだ苦労しています。

  1. 単純なRには、数字の合計のための関数は本当にありませんか?
  2. この関数をコーディングするよりスマートな方法はありますか?
4

4 に答える 4

18

これはより良いはずです:

digitsum <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)
于 2013-09-07T16:35:33.140 に答える
8

提案された 3 つの方法 (および 4 つ目の方法) のうちどれが最も高速なのか疑問に思ったので、ベンチマークを行いました。

  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))
    
  4. R-help メーリング リストの Greg Snow による関数に基づいています。

    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にあります。

于 2016-03-29T00:40:24.197 に答える
3

それを行うための組み込み関数があると思う理由がわかりません。それは実際には統計操作ではありません。より多くの数論的な手順です。(Rhelp アーカイブの検索で見つけることができる多くの例があります。私はその目的でMarkmailを使用しますが、RSeek、GMane、および Newcastle Web ページなどの他の検索エンジンがあります。関数は一連の数値を取得し、それらすべての桁の合計である単一の数値. それが目標である場合、それは合理的に設計されているように見えます. 私は、各数値から桁の合計が必要になると推測したでしょう:

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

pkg:GLDEX には「デジタル化」関数 digitsBase があり、 as.numeric(unlist(split(as.character(x),""))) をその関数に置き換えることができます:

digitsBase(x, 10)
于 2013-09-07T16:29:07.643 に答える
0

R の桁の合計を見つけるために私がすること:

x = readline("Enter the number")
a = as.integer(c(strsplit(x,split="")[[1]]))
print((sum(a)))
于 2019-04-08T18:10:37.873 に答える