从具有多个数字的数字中分割出一个字符

时间:2012-01-03 23:52:00

标签: string r

我在数据框中有一列,其中的值是字母数字组合,如G1,K8,A132等。我想从数字中拆分字母,但将数字保留为单个数字。我一直在使用strsplit,但是这会给出一个值列表,如下所示,我希望得到G10的输出:

x <- "G10"
strsplit(x, "")[[1]][1]
"G"
strsplit(x, "")[[1]][-1]
"1" "0"
当我尝试将数字用作数字时,这会导致可预测的下游问题。这是一个paste示例,我想获得“somethingelse_10”:

z <-strsplit(x, "")[[1]][-1]
paste("somethingelse",z, sep="_")
"somethingelse_1" "somethingelse_0"

有没有一种简单的方法可以从字母中分割数字?

3 个答案:

答案 0 :(得分:14)

您可以使用gsub消除所有非数字或所有数字字符,如下所示:

> x <- "A3"
> gsub("[^[:digit:]]","",x)
"3"
> gsub("[:digit:]","",x)
"A"

然后,如果您愿意,可以使用as.numeric从字符串转换为数字。

答案 1 :(得分:9)

stringr 包通常具有便于此类操作的功能:

require(stringr)
str_extract(c("A1","B2","C123"),"[[:upper:]]")
#[1] "A" "B" "C"
str_extract(c("A1","B2","C123"),"[[:digit:]]+")
#[1] "1"   "2"   "123"

假设每个元素只有一个“字母”部分和一个“数字”部分,因为str_extract只是拉出匹配的第一个实例。

答案 2 :(得分:3)

如果您的评论建议您只有一个字母后跟一个或多个数字,则可以执行与此类似的操作:

x <- c("G10", "X1231", "y14522")
# Just grab the first letter
letter <- substring(x, 1, 1)
letter
# [1] "G" "X" "y"
# Grab everything except the first character and convert to numeric
number <- as.numeric(substring(x, 2, nchar(x)))
number
#[1]    10  1231 14522