【问题标题】:Sum all integers > 9 individually in R. E.g. 10 = 1+0, 11 = 1+1在 R 中单独对所有大于 9 的整数求和。 10 = 1+0, 11 = 1+1
【发布时间】:2021-12-08 06:10:16
【问题描述】:

我正在尝试编写一个基于 Luhn 算法(mod 10 算法)的函数,并且我需要一个函数来分别对我的数字向量中所有大于 9 的整数求和。例如。 10 的总和应为 1+0=1,而 19 的总和应为 1+9=10。示例代码:

nmr <- ("1_9_8_2_0_5_0_1_3_3_4_8")
nmr <- strsplit(nmr, "_")
nmr <- as.numeric(as.character(unlist(nmr[[1]])))
luhn_alg <- c(0,0,2,1,2,1,2,1,2,1,2,0)
x <- nmr*luhn_alg
x
[1]  0  0 16  2  0  5  0  1  6  3  8  0

sum(x)

[1] 41

我不希望 x 的总和等于 41。相反,我希望总和等于:0+0+1+6+2+0+5+0+1+6+3+8+0=32。我尝试了一个 for 循环,但似乎没有做对。非常感谢任何帮助。

【问题讨论】:

    标签: r function loops


    【解决方案1】:

    luhn_alg相乘后,您可能需要再次拆分数据。

    Luhn_sum <- function(x, y) {
      nmr <- as.numeric(unlist(strsplit(x, "_")))
      x1 <- nmr*y
      x1 <- as.numeric(unlist(strsplit(as.character(x1), '')))
      sum(x1)
    }
    
    nmr <- ("1_9_8_2_0_5_0_1_3_3_4_8")
    luhn_alg <- c(0,0,2,1,2,1,2,1,2,1,2,0)
    Luhn_sum(nmr, luhn_alg)
    #[1] 32
    

    【讨论】:

      【解决方案2】:

      您可以使用substringseq 创建单个数字的向量,然后只需对它们求和即可:

      sum(
        as.numeric(
          substring(
            paste(x, collapse = ""), 
            seq(1, sum(nchar(x)), 1), 
            seq(1, sum(nchar(x)), 1)
          )
        )
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2014-11-11
        • 1970-01-01
        • 2016-01-03
        • 2020-10-02
        • 1970-01-01
        相关资源
        最近更新 更多