计算R中的尾随零

问题描述 投票:2回答:3

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

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是否通过查看ifelse的定义来使用str_detect

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

r regex string stringr
3个回答
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


5
投票

我找到了一个基本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

4
投票

我们可以使用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

data

x = c('0000','1200','1301','X230','9900')
© www.soinside.com 2019 - 2024. All rights reserved.