Извлечение чисел из векторов строк

regex r

103444 просмотра

11 ответа

У меня есть строка, как это:

years<-c("20 years old", "1 years old")

Я хотел бы получить только числовой номер из этого вектора. Ожидаемый результат - вектор:

c(20, 1)

Как мне это сделать?

Автор: user1471980 Источник Размещён: 12.11.2019 09:16

Ответы (11)


71 плюса

Решение

Как насчет

# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))

или же

# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))

или же

# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
Автор: Arun Размещён: 27.01.2013 01:51

49 плюса

Я думаю, что замена - это косвенный способ найти решение. Если вы хотите получить все номера, я рекомендую gregexpr:

matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))

Если у вас есть несколько совпадений в строке, они получат их все. Если вас интересует только первый матч, используйте regexprвместо, gregexprи вы можете пропустить unlist.

Автор: sebastian-c Размещён: 27.01.2013 04:31

46 плюса

Обновление Поскольку extract_numericустарело, мы можем использовать parse_numberиз readrпакета.

library(readr)
parse_number(years)

Вот еще один вариант с extract_numeric

library(tidyr)
extract_numeric(years)
#[1] 20  1
Автор: akrun Размещён: 02.08.2016 05:23

31 плюса

Вот альтернатива первому решению Аруна с более простым Perl-подобным регулярным выражением:

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))
Автор: Andrew Размещён: 27.01.2013 02:04

19 плюса

Или просто:

as.numeric(gsub("\\D", "", years))
# [1] 20  1
Автор: 989 Размещён: 11.07.2016 10:34

17 плюса

stringrКонвейерное решение:

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
Автор: Joe Размещён: 01.10.2016 12:55

15 плюса

Вы также можете избавиться от всех букв:

as.numeric(gsub("[[:alpha:]]", "", years))

Вероятно, это менее обобщенно.

Автор: Tyler Rinker Размещён: 27.01.2013 02:27

4 плюса

Извлечение чисел из любой строки в начальной позиции.

x <- gregexpr("^[0-9]+", years)  # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))

Извлечение чисел из любой строки НЕЗАВИСИМО от позиции.

x <- gregexpr("[0-9]+", years)  # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
Автор: sbaniwal Размещён: 24.12.2016 05:47

2 плюса

После сообщения от Габора Гротендика в списке рассылки r-help

years<-c("20 years old", "1 years old")

library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
Автор: juanbretti Размещён: 27.04.2016 07:50

1 плюс

Мы также можем использовать str_extractотstringr

years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20  1

Если в строке несколько чисел, и мы хотим извлечь все из них, мы можем использовать, str_extract_allкоторый в отличие от str_extractвозвращает все числа.

years<-c("20 years old and 21", "1 years old")
stringr::str_extract(years, "\\d+")
#[1] "20"  "1"

stringr::str_extract_all(years, "\\d+")

#[[1]]
#[1] "20" "21"

#[[2]]
#[1] "1"
Автор: Ronak Shah Размещён: 28.08.2019 06:14

0 плюса

Используя пакет unglue мы можем сделать:

# install.packages("unglue")
library(unglue)

years<-c("20 years old", "1 years old")
unglue_vec(years, "{x} years old", convert = TRUE)
#> [1] 20  1

Создано 2019-11-06 пакетом представлением (v0.3.0)

Дополнительная информация: https://github.com/moodymudskipper/unglue/blob/master/README.md

Автор: Moody_Mudskipper Размещён: 06.11.2019 12:08
Вопросы из категории :
32x32