R中的数字和函数

时间:2013-09-07 16:10:12

标签: r

我在R中寻找非常基本的数字函数digit sum

  • 我没有找到预装的功能。
  • 即使在Stackoverflow中也是如此 广泛的R库我没有找到记录。

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

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

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

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

4 个答案:

答案 0 :(得分:15)

这应该更好:

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

答案 1 :(得分:5)

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

  1. $timeout(function(){ var ele = document.getElementById("myid"); ele.value = 999; $scope.testForm.anim.$setViewValue(ele.value); },5000);

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

  3. 使用GLDEX包中的函数digitsBase:

    digitsum2 <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)
  4. 基于Greg Snow在github中的功能:

    library(GLDEX, quietly = TRUE) digitsum3 <- function(x) sum(digitsBase(x, base = 10))

  5. 基准代码:

    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
    )
    

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

    完整的基准测试结果(包括图表)位于{{3}}。

答案 2 :(得分:4)

我不确定为什么你会认为会有一个内置函数来做到这一点。这不是一个统计操作。更多的理论类程序。 (通过搜索Rhelp Archives可以找到很多例子。我使用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)

答案 3 :(得分:0)

我如何找到R中的数字之和:

.grid_image {
  width:100%;
  height:100%;
  object-fit:cover;
->transition:0.5s ease-in; or transition:all 0.5s ease-in;
}

.grid_item:hover .text {
  display: block;
  /*text to see, otherwise hides in the back */
  z-index: 999;
->animation : slide 0.7s ease-in;
}

    @keyframes slide {
      0%{
        top:-100px;
      }

      75% {
        top: -25px;
      }