regex在Hour.table R中快速清洁每小时工资列

时间:2017-03-08 22:45:37

标签: r regex foreach data.table

我正在尝试清理非结构化数据列。我只想删除列的数字部分。工资号码之前或之后没有美元符号或其他任何内容。

目前,我正在使用foreach循环,但实际上10,000行的表格确实很慢。在数据表foo中,startPay是原始数据格式,startPayCLEAN是所需的结果。

library(data.table)
foo$startPayCLEAN <- NA
foo <- data.table(startPay=c("12.00 hr","$12.02","$8.00 per hour","18.00 ph","10.50 pre hr."))
foo[,id:=seq.int(1,nrow(foo))]
rowCount <- seq.int(1,nrow(foo))
startPay <- foreach (i=rowCount,.combine=rbind,.packages='data.table') %do% {
  if (unlist(gregexpr("[0-9.]",foo$startPay)[i])==-1) {
    NA } else {
      charList <- unlist(gregexpr("[.0-9]",foo$startPay)[i])
      charList <- charList[which(charList<8)]
      substr(foo$startPay[i],min(charList),max(charList))
    }
}

foo$startPayCLEAN <- startPay

2 个答案:

答案 0 :(得分:2)

我认为您只需要使用gsub来选择数字部分。

gsub(".*?(\\d+\\.\\d+).*", "\\1", foo$startPay)
[1] "12.00" "12.02" "8.00"  "18.00" "10.50"

您可能希望将其转换为数字。

as.numeric(gsub(".*?(\\d+\\.\\d+).*", "\\1", foo$startPay))
[1] 12.00 12.02  8.00 18.00 10.50

答案 1 :(得分:1)

你应该能够做到这一个正则表达式:

library(data.table)

foo <- data.table(startPay=c("12.00 hr","$12.02","$8.00 per hour","18.00 ph","10.50 pre hr."))
foo[, startPayCLEAN := gsub("(^\\.|[^0-9.]|\\.$)", replacement = "", startPay)]

这里的正则表达式可以分为三个部分(通过管道):

  • ^\\. - 字符串从点
  • 开始
  • [^0-9.] - 字符串不是数字或点
  • \\.$字符串以点结尾

gsubstartPay中找到匹配的字符,并用空字符串替换它们。

正则表达式管道中的

是OR。 (a|b)将匹配ab