说我有一个向量myvec <- c("00890","0891","Apple-20","00-china-usa","0123Belgium")
。
我想删除此向量中数值前的所有零,而不是字母数字,并获得如下所示的结果。
结果
"890", "891", "Apple-20","00-china-usa","0123Belgium"
答案 0 :(得分:3)
你可以用gsub和正则表达式来做。将[1-9]
括在括号中,您可以使用\\1
gsub("^0+([1-9])","\\1",myvec)
编辑:实际上,从0123Belgium切割0,这有效:
ifelse(grepl("[A-z]",myvec),myvec,gsub("^0+([1-9])","\\1",myvec))
答案 1 :(得分:2)
我们可以使用sub
执行此操作。我们将以{(1}})开头的字符串与一个或多个零后跟一个或多个数字(^
)进行匹配,我们将其作为一组(即[0-9]+
内)捕获直到结束(字符串(..)
)。在替换中,我们使用反向引用($
)来替换捕获的组。请注意,这不会触及具有字符后缀的字符串中的前导0。在这个例子中是\\1
。
0123Belgium
或者使用sub("^0+([0-9]+)$", "\\1", myvec)
#[1] "890" "891" "Apple-20" "00-china-usa" "0123Belgium"
仅匹配数字元素而不匹配任何字母。
^
使用其他sub("^0+([^[:alpha:]]+)$", "\\1", myvec)
进行测试,以检查此答案是否失败
vector
sub("^0+([0-9]+)$", "\\1", myvec1)
#[1] "8090" "10" "00-china-012Belgium" "012C001"
答案 2 :(得分: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