我正在学习数据科学的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比赛。
答案 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)
我们可以使用正则表达式的外观将stringr
与prods[, 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 $*