Извлечь числовую часть строк смешанных чисел и символов в R

У меня много строк, и каждый из них имеет следующий формат: Ab_Cd-001234.txt Я хочу заменить его на 001234. Как я могу достичь этого в R?

Ответы

Ответ 1

Используя gsub или sub, вы можете сделать это:

 gsub('.*-([0-9]+).*','\\1','Ab_Cd-001234.txt')
"001234"

вы можете использовать regexpr с regmatches

m <- gregexpr('[0-9]+','Ab_Cd-001234.txt')
regmatches('Ab_Cd-001234.txt',m)
"001234"

РЕДАКТИРОВАТЬ 2 метода векторизации и работает для вектора строк.

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
sub('.*-([0-9]+).*','\\1',x)
"001234" "001234"

 m <- gregexpr('[0-9]+',x)
> regmatches(x,m)
[[1]]
[1] "001234"

[[2]]
[1] "001234"

Ответ 2

В пакете stringr есть много удобных ярлыков для такого рода работ:

# input data following @agstudy
data <-  c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')

# load library
library(stringr)

# prepare regular expression
regexp <- "[[:digit:]]+"

# process string
str_extract(data, regexp)

Which gives the desired result:

  [1] "001234" "001234"

Чтобы немного объяснить regexp:

[[:digit:]] - любое число от 0 до 9

+ означает, что предыдущий элемент (в данном случае цифра) будет сопоставляться один или несколько раз

Эта страница также очень полезна для такого рода обработки строк: http://en.wikibooks.org/wiki/R_Programming/Text_Processing

Ответ 3

Вы можете использовать genXtract из qdap-пакета. Это берет левую строку символов и правильную строку символов и извлекает элементы между ними.

library(qdap)
genXtract("Ab_Cd-001234.txt", "-", ".txt")

Хотя я предпочитаю ответ agstudy.

EDIT Расширение ответа для соответствия agstudy's:

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
genXtract(x, "-", ".txt")

# $`-  :  .txt1`
# [1] "001234"
# 
# $`-  :  .txt2`
# [1] "001234"

Ответ 4

gsub Удалите префикс и суффикс:

gsub(".*-|\\.txt$", "", x)

пакет инструментов Используйте file_path_sans_ext из инструментов для удаления расширения, а затем используйте sub для удаления префикса:

library(tools)
sub(".*-", "", file_path_sans_ext(x))

strapplyc Извлеките цифры после - и перед точкой. Для получения дополнительной информации см. домашняя страница gsubfn:

library(gsubfn)
strapplyc(x, "-(\\d+)\\.", simplify = TRUE)

Обратите внимание, что если бы было желательно вернуть числовое значение, мы могли бы использовать strapply, а не strapplyc, как это:

strapply(x, "-(\\d+)\\.", as.numeric, simplify = TRUE)