如何在R中的data.table列中有效地从文本中提取数字

时间:2016-08-30 15:24:59

标签: r regex data.table stringr kaggle

我正在学习数据科学的R,并使用这几行来从数据中提取数字(使用data.table):

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

但它将'weights'列中的所有内容设置为data.table的第一个结果。顺便说一句,这是来自Grupo Bimbo Kaggle比赛。

2 个答案:

答案 0 :(得分: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 :(得分:2)

我们可以使用正则表达式的外观将stringrprods[, weights := as.numeric(str_extract(NombreProducto, "([0-9]+)(?=[kgKG])"))] 一起使用。

#!/bin/sh
#
# rc file for SonarQube
#
# chkconfig: 345 96 10
# description: SonarQube system (www.sonarsource.org)
#
### BEGIN INIT INFO
# Provides: sonar
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: SonarQube system (www.sonarsource.org)
# Description: SonarQube system (www.sonarsource.org)
### END INIT INFO

/usr/bin/sonar $*