假设我有一个向量 myvec <- c("00890","0891","Apple-20","00-china-usa","0123Belgium")
。我想从这个向量中删除所有数字值前面的零,而不是字母和数字组合,并得到如下所示的结果。
结果
"890", "891", "Apple-20","00-china-usa","0123Belgium"
假设我有一个向量 myvec <- c("00890","0891","Apple-20","00-china-usa","0123Belgium")
。我想从这个向量中删除所有数字值前面的零,而不是字母和数字组合,并得到如下所示的结果。
结果
"890", "891", "Apple-20","00-china-usa","0123Belgium"
[1-9]
放在括号中,以便使用 \\1
将其保留在输出中。gsub("^0+([1-9])","\\1",myvec)
编辑:实际上,这会从0123比利时中剪切掉0,这个方法有效:
ifelse(grepl("[A-z]",myvec),myvec,gsub("^0+([1-9])","\\1",myvec))
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")
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