【问题标题】:split a character from a number with multiple digits从具有多个数字的数字中拆分字符
【发布时间】:2012-01-03 23:51:59
【问题描述】:

我在数据框中有一列,其中的值是字母数字组合,如 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"

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

【问题讨论】:

  • 格式是否总是一个字母后跟一些数字?
  • 在这种情况下,一个或多个数字前只有一个字母。

标签: string r


【解决方案1】:

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

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

然后你可以使用as.numeric 将字符串转换为数字,如果你愿意的话。

【讨论】:

  • 您可以添加一个提取字母的解决方案(请参阅 joran 的答案)。事实上,可以编写一个函数来提取字母和数字,并让apply 处理 data.frame 列。 :)
  • @aaronjg 要获取字母,您需要额外的一对 []
【解决方案2】:

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 只是拉取匹配项的第一个实例。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多