我正在尝试清理非结构化数据列。我只想删除列的数字部分。工资号码之前或之后没有美元符号或其他任何内容。
目前,我正在使用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
答案 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.]
- 字符串不是数字或点\\.$
字符串以点结尾 gsub
在startPay
中找到匹配的字符,并用空字符串替换它们。
是OR。 (a|b)
将匹配a
或b
。