Извлечь числовую часть строк смешанных чисел и символов в 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)