将一串数字转换为数字以便在R中匹配

时间:2018-04-03 06:41:28

标签: r string loops math sequence

我有一个问题,我想看看字符串是否是一个增加1的序列。也就是说,任何2个连续数字之间的差异是1.字符串是折叠形式:

91011
89909192
18192123

其中前两个是字符串增加1但第三个不是。这是因为91010是9,10,11和89909192是89,90,91,92。然而18192123是18,19,21,23,所以差异大于1。

如何检查上述示例(以及一般情况下)中的每个字符串是否增加1或不使用R?

当然假设最大字符串长度为32,因此......

99999999999999989999999999999999

是连续数字增加1的最长字符串,因为我们有99999999999999998然后是9999999999999999,长度是2x16。

所以最糟糕的情况我们需要得到16个循环,但我不确定是否有更简单的方法,然后为16个循环中的每个循环添加一个序列和粘贴。

1 个答案:

答案 0 :(得分:3)

您可以尝试使用递归函数:您获得第一个数字,尝试添加下一个数字,直到达到所需的长度,如果它不起作用,请再试一次,取前两个数字,依此类推:

cons_d <- function(str, nb=1) {
    l_str <- nchar(str)
    if(nb>=l_str) return("No") # if the number of digits you're trying is more than the length of strings then return "No"
    n1 <- as.numeric(substr(str, 1, nb))
    i <- 1
    while(nchar(n2 <- paste(n1:(n1+i), collapse=""))<l_str) {i <- i+1}
    if(n2==str) return("yes") else cons_d(str, nb+1) # if you get the right string, return yes, else, try again with one more digit
}

测试您的测试字符串:

cons_d("91011")
[1] "yes"
cons_d("89909192")
[1] "yes"
cons_d("18192123")
[1] "No"