2016-08-02 2 views
0

Притворитесь У меня есть вектор:Извлечение числа строки различной длины

testVector <- c("I have 10 cars", "6 cars", "You have 4 cars", "15 cars") 

Есть ли способ идти о разборе этого вектора, так что я могу хранить только числовые значения:

10, 6, 4, 15 

Если проблема была всего лишь «15 автомобилей» и «6 автомобилей», я знаю, как ее разобрать, но я испытываю трудности со строками, у которых есть текст спереди! Любая помощь приветствуется.

ответ

3

Мы можем использовать str_extract с рисунком \\d+, что означает соответствие одному или нескольким номерам. Его можно иначе написать как [0-9]+.

library(stringr) 
as.numeric(str_extract(testVector, "\\d+")) 
#[1] 10 6 4 15 

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


Это может быть также сделано с base R (без внешних пакетов, используемых)

as.numeric(regmatches(testVector, regexpr("\\d+", testVector))) 
#[1] 10 6 4 15 

Или с помощью gsub из base R

as.numeric(gsub("\\D+", "", testVector)) 
#[1] 10 6 4 15 

Кстати, некоторые функции только с помощью gsub, от extract_numeric

function (x) 
{ 
    as.numeric(gsub("[^0-9.-]+", "", as.character(x))) 
} 

Таким образом, если нам нужна функция, мы можем создать (без использования каких-либо внешних пакетов)

ext_num <- function(x) { 
      as.numeric(gsub("\\D+", "", x)) 
     } 
ext_num(testVector) 
#[1] 10 6 4 15 
+0

Спасибо! Можете ли вы мне объяснить, что означает «\\ d +»? – Sheila

+0

@Sheila Обновлено сообщение – akrun

+3

regex https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ – Nate

5

Для этой конкретной общей задачи, есть хороший помощник функция tidyr называется extract_numeric:

library(tidyr) 

extract_numeric(testVector) 
## [1] 10 6 4 15 
1

Это может также пригодиться.

testVector <- gsub("[:A-z:]","",testVector) 
testVector <- gsub(" ","",testVector) 

> testVector 
[1] "10" "6" "4" "15" 
Смежные вопросы