Извлечь число из строки в r - PullRequest
0 голосов
/ 19 сентября 2019

Здравствуйте, как я могу извлечь число, которое находится между двумя тире из текста?

Вот примерный набор:

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

Может кто-нибудь дать подсказку?

Спасибо

Ответы [ 3 ]

3 голосов
/ 19 сентября 2019

Вы можете использовать функцию str_extract из пакета "stringr":

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

(? <=) И (? =) - это строки, которые смотрят сзади и смотрят в будущее. </p>

2 голосов
/ 19 сентября 2019

Вы можете сделать это с помощью 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 заменит всю строку только цифрами.Это дает строки с цифрами.Я использовал as.numeric, чтобы превратить их в числа, а не в строки.

1 голос
/ 19 сентября 2019

Мы можем использовать 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
...