2016-08-30 7 views
0

Я только учусь R для науки данных, и использовать эти несколько строк для извлечения числа из данных (с использованием data.table):Как эффективно извлекать числа из текста в колонке data.table в R

library(stringr) 
library(data.table) 
prods[, weights := str_extract(NombreProducto, "([0-9]+)[kgKG]+")] 
prods[, weights := str_extract(weights, "[0-9]+")] 
prods[, weights := as.numeric(weights)] 

Вот пример поля «NombreProducto» Я хочу, чтобы извлечь номера/текст из:

"Tostado 210g CU BIM 1182" 

есть простой способ сделать это в сжатом однострочнике? Я попробовал

prods[, weights := str_match(NombreProducto, "([0-9]+)[kgKG]+")[2]] 

, но он установил все в столбце «веса» для первого результата из таблицы данных. Кстати, это из конкурса Grupo Bimbo Kaggle.

+0

Непонятно, что вы действительно хотели. – akrun

+0

Я хочу первый фрагмент кода в одной строке. – wordsforthewise

+1

Попробуйте 'prods [, weight: = as.numeric (str_extract (NombreProducto)" ([0-9] +) (? = (Kg | KG)) "))]' – akrun

ответ

3

Без использования stringr, вы могли бы просто использовать sub с ".*?(\\d+)[kgKG].*" и обратной ссылкой:

s = "Tostado 210g CU BIM 1182" 

sub(".*?(\\d+)[kgKG].*", "\\1", s) 
# [1] "210" 
  • использование (\\d+)[kgKG], чтобы соответствовать цифрам следует k, K, g, G букв;
  • указать .* до и после шаблона, чтобы можно было удалить строки, отличные от шаблона;
  • использовать ? на первом .*, чтобы сделать матч неточным, чтобы все три цифры были сохранены;
  • использовать \\1 для ссылки на группу захвата (\\d+);
1

Мы можем использовать это с stringr в одной строке с использованием регулярных выражений.

prods[, weights := as.numeric(str_extract(NombreProducto, "([0-9]+)(?=[kgKG])"))]