Подтвердить что ты не робот

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

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

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

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

c(20, 1)

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

4b9b3361

Ответ 1

Как насчет

# 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))

Ответ 2

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

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

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

Ответ 3

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

library(readr)
parse_number(years)

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

library(tidyr)
extract_numeric(years)
#[1] 20  1

Ответ 4

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

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))

Ответ 5

Или просто:

as.numeric(gsub("\\D", "", years))
# [1] 20  1

Ответ 6

A stringr конвейерное решение:

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric

Ответ 7

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

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

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

Ответ 8

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

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)))

Ответ 9

После сообщения из Gabor Grothendieck в списке рассылки 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]])

Ответ 10

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