【问题标题】:Extract a number from a string in r从r中的字符串中提取一个数字
【发布时间】:2019-09-19 17:04:37
【问题描述】:

您好,如何从文本中提取两个破折号之间的数字?

这是一个示例数据集:

text.var <- c("abd-GEN-eft-na-M-D-BINED-10-XX1","abd-GEN-eft-na-M-D-BINED-2-XX2","abd-GEN-eft-na-M-D-BINED-3-XX1")
id <- c(1,2,3)

data <- data.frame("id"=id,"text"=text.var)

> data
  id                            text
1  1 abd-DEF-eft-na-M-D-BINED-10-XX1
2  2  abd-DEF-eft-na-M-D-BINED-2-XX2
3  3  abd-DEF-eft-na-M-D-BINED-3-XX1

我想提取“-”之间的数字。我想要的结果是:

> data
  id                            text    number
1  1 abd-DEF-eft-na-M-D-BINED-10-XX1      10
2  2  abd-DEF-eft-na-M-D-BINED-2-XX2       2
3  3  abd-DEF-eft-na-M-D-BINED-3-XX1       3

谁能给点提示?

谢谢

【问题讨论】:

    标签: r string extract


    【解决方案1】:

    您可以使用“stringr”包中的str_extract 函数:

    library(stringr)
    str_extract(text.var, "(?<=-)[0-9]+(?=-)")
    

    (?

    【讨论】:

      【解决方案2】:

      您可以使用sub 和正则表达式来执行此操作。

      text.var <- c("abd-GEN-eft-na-M-D-BINED-10-XX1","abd-GEN-eft-na-M-D-BINED-2-XX2","abd-GEN-eft-na-M-D-BINED-3-XX1")
      id <- c(1,2,3)
      number = as.numeric(sub(".*-(\\d+)-.*", "\\1", text.var))
      
      data <- data.frame("id"=id,"text"=text.var, number)
      
      data
       id                            text number
      1  1 abd-GEN-eft-na-M-D-BINED-10-XX1     10
      2  2  abd-GEN-eft-na-M-D-BINED-2-XX2      2
      3  3  abd-GEN-eft-na-M-D-BINED-3-XX1      3
      

      一些额外的细节

      在正则表达式中,-\\d+- 挑选出由短划线包围的数字序列。我在 \d 部分加上括号来存储找到的数字 -(\\d+)-.* 之前和之后的 -(\\d+)- 匹配所有其余字符。所以sub 将只用数字替换整个字符串。这给出了带有数字的 strings。我使用as.numeric 将它们变成数字而不是字符串。

      【讨论】:

        【解决方案3】:

        我们可以使用str_extract

        library(stringr)
        library(dplyr)
        data %>% 
           mutate(number = as.numeric(str_extract(text, "\\d+(?=-)")))
        #    id                            text number
        #1  1 abd-GEN-eft-na-M-D-BINED-10-XX1     10
        #2  2  abd-GEN-eft-na-M-D-BINED-2-XX2      2
        #3  3  abd-GEN-eft-na-M-D-BINED-3-XX1      3
        

        【讨论】:

          猜你喜欢
          • 2014-06-12
          • 2013-06-05
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多