在R向量中去除没有小数的数字前导零

3

假设我有一个向量 myvec <- c("00890","0891","Apple-20","00-china-usa","0123Belgium")。我想从这个向量中删除所有数字值前面的零,而不是字母和数字组合,并得到如下所示的结果。

结果

"890", "891", "Apple-20","00-china-usa","0123Belgium"
3个回答

3
你可以使用 gsub 和正则表达式实现。将 [1-9] 放在括号中,以便使用 \\1 将其保留在输出中。
gsub("^0+([1-9])","\\1",myvec)

编辑:实际上,这会从0123比利时中剪切掉0,这个方法有效:

ifelse(grepl("[A-z]",myvec),myvec,gsub("^0+([1-9])","\\1",myvec))

2
我们可以使用sub来完成这个任务。我们匹配以一个或多个零开头(^),后跟一个或多个数字([0-9]+)的字符串,并将其作为一个组捕获(即在(..)内部),直到字符串的结尾($)。在替换中,我们使用反向引用(\\1)来替换已捕获的组。请注意,这不会触及带有字符后缀的字符串中的前导0,例如本例中的0123Belgium
sub("^0+([0-9]+)$", "\\1", myvec) 
#[1] "890"          "891"          "Apple-20"     "00-china-usa" "0123Belgium" 

或者使用^只匹配数字元素而不是任何字母。

sub("^0+([^[:alpha:]]+)$", "\\1", myvec) 

使用另一个向量进行测试,以检查此答案是否失败

sub("^0+([0-9]+)$", "\\1", myvec1) 
#[1] "8090"                "10"                  "00-china-012Belgium" "012C001"  

数据

myvec <- c("00890","0891","Apple-20","00-china-usa","0123Belgium")
myvec1 <- c("008090", "010", "00-china-012Belgium", "012C001")

1
谢谢,我懂了。我以为那个评论是针对我的。 - MAPK

1
另一种方法是将myvec中的元素转换为数字,而那些既包含字母又包含数字的元素保持不变。
ifelse(is.na(as.numeric(myvec)), myvec, as.numeric(myvec))

#[1] "890"          "891"          "Apple-20"     "00-china-usa" "0123Belgium" 
#Warning messages:
#1: In ifelse(is.na(as.numeric(myvec)), myvec, as.numeric(myvec)) :
#NAs introduced by coercion
#2: In ifelse(is.na(as.numeric(myvec)), myvec, as.numeric(myvec)) :
#NAs introduced by coercion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接