2016-10-31 7 views
0

У меня есть data.frame с двумя переменными строковых выражений, как «ABC` ж/XYZ 8», где ж = любое число от 1 до 999. Что мне нужно сделать, это вычитать ж и замените всю строку на нее. Я использую этот код:Как правильно извлечь числовой компонент из сложных строк в кадре данных и подставить строки с выводом вывода?

df <- data.frame(a = c("ABC`5/XYZ 8", "A`25/BHU 19", "ach`246/chy 0"), b = c("sfse`3/cjd 65", "jlke`234/Chu 19", "h`45/hy 0")) 

df$a <- sapply(df$a, function(x) {substr(df$a[x], regexpr("`[0-9]+/", df$a[x]) +1, 
+ regexpr("`[0-9]+/", df$a[x]) + attr(regexpr("`[0-9]+/", df$a[x]), "match.length")-2)}) 

Он работает, но вместо а = с (5, 25, 246) я получаю = с (25, 5, 246). Я предполагаю, что это происходит из-за факторного класса a. Однако, когда a является символом класса, я получаю NA в качестве вывода. Есть ли способ сохранить порядок или использовать sapply и substr для массива символов?

+1

Возможный дубликат [как извлечь первое число из каждой строки в вектор в R?] (Http://stackoverflow.com/ вопросы/25885361/как к экстракту-The-первый номер-от-каждой-строки-в-вектор-в-г). Еще одно очень важное сообщение: [извлечь первое число из строки] (http://stackoverflow.com/questions/23323321/r-extract-first-number-from-string) – Jota

ответ

1

Мы можем использовать sub для извлечения чисел, указанных в позиции 'w' строки. Сопоставьте шаблон одного или нескольких алфавитов вместе с «` `», запишите одно или несколько номеров, следующих за ним, как группу ((\\d+)), за которыми следуют другие символы (.*) и замените его на обратную ссылку группы захвата.

as.numeric(sub("[A-Za-z`]+(\\d+).*", "\\1", df$a)) 
#[1] 5 25 246 

Или другой вариант str_extract

library(stringr) 
as.numeric(str_extract(df$a, "\\d+")) 
#[1] 5 25 246