【问题标题】:Count trailing zeros in R计算R中的尾随零
【发布时间】:2018-02-28 07:56:26
【问题描述】:

如何计算字符串向量中的尾随零。例如,如果我的字符串向量是:

x = c('0000','1200','1301','X230','9900')

答案应该是

> numZeros
[1] 4 2 0 1 2

我不想使用多个ifelse,因为我认为应该提供更优雅、更快速的解决方案。我尝试使用模数,像这样

y = as.integer(x)
numZeros = (!(y%%10000))+(!(y%%1000))+(!(y%%100))+(!(y%%10))

但这需要两个条件才能成立。

  • 字符串的最大长度是固定的(在我的例子中是这样)并且
  • 向量中的所有字符串都可以转换为整数,但在我的情况下并非如此。

然后使用stringr包并创建了一个解决方案,但是很长。

library(stringr)
numZeros = 
4*str_detect(x,"0000") + 
3*str_detect(x,"[1-9 A-Z]000") + 
2*str_detect(x,"[1-9 A-Z]{2}00") + 
str_detect(x,"[1-9 A-Z]{3}0")

另外,通过查看str_detect 的定义,我无法确定str_detect 是否使用ifelse

我发现了同样的问题here,但对于 python。如果已针对 R 回答此问题,请提供链接。

【问题讨论】:

    标签: r regex string stringr


    【解决方案1】:

    我找到了一个以R为基础的简单解决方案:

    x <- c('0000','1200','1301','X230','9900')
    nchar(x) - nchar(sub("0*$", "", x))
    # > nchar(x) - nchar(sub("0*$", "", x))
    # [1] 4 2 0 1 2
    

    【讨论】:

    • 很好,实际上我需要的最终输出只有nchar(sub("0*$", "", x))。惊人的。但唉,我只能接受 1 个答案。
    【解决方案2】:

    我们可以使用str_extract在字符串的末尾($)提取一个或多个0,并使用nchar来获取计数。如果需要,将 NA 元素分配给 0

    library(stringr)
    res <- nchar(str_extract(x, "0+$"))
    res[is.na(res)] <- 0
    res
    #[1] 4 2 0 1 2
    

    数据

    x = c('0000','1200','1301','X230','9900')
    

    【讨论】:

      【解决方案3】:

      您可以匹配所有尾随0s,然后计算它们。这是一个基本的 R 解决方案:

      > matches <- regmatches(x, gregexpr("0(?=0*$)", x, perl=TRUE))
      > sapply(matches, length)
      [1] 4 2 0 1 2
      

      这里,0(?=0*$) 匹配任何在字符串末尾 ($) 后跟零个或多个 (*) 零的 0

      请参阅 this regex demoR demo online

      【讨论】:

      • 也感谢您解释解决方案。
      猜你喜欢
      • 2021-10-31
      • 2018-11-06
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2020-05-11
      • 1970-01-01
      相关资源
      最近更新 更多