我收到了以下提示:
给定一个文本字符串向量V.text,编写一个函数,从每个字符串中提取可能的美元金额和日期,并将它们作为与V.text相同长度的列表的单独向量组件返回。金额和日期应作为文本字符串返回,格式与输入完全相同。例如,如果其中一个输入字符串是“在2009年1月5日列出180000并在2009年3月1日以150,250美元的价格出售”,则该元素的输出应该是包含两个向量的列表,一个用于金额,一个用于金额对于约会。金额应为“180000”和“150,250美元”,日期应为“1/05/2009”和“3/1/2009”。
我尝试解决方案是:
four <- function(x) {
#split the data into individual observations
lines <- str_split(x, "\n")
n <- length(lines)
list.date = NA; list.price = NA; sell.price = NA; sell.date = NA; temp = NA
for (i in seq_len(n)) {
list.date[i] <- word(x[i], 3)
list.price[i] <- word(x[i], 5)
sell.price[i] <- word(x[i], 9)
sell.date[i] <- word(x[i], 11)
}
temp <- data.frame(list.date, list.price, sell.price, sell.date)
temp
}
这个解决方案有两个原因。首先,它输出数据帧而不是包含两个向量的列表。其次,如果输入文本字符串发生变化,我的解决方案就没用了。
如果得到任何支持,我将非常感激。
答案 0 :(得分:4)
例如,使用gregexpr
和regmatches
举例说明上一个答案提示:
ll <- c("Listed on 1/05/2009 for 180000 and sold for $150,250 on 3/1/2009",
"Listed on 1/05/2012 for $300,400 and sold 120 for on 145,25")
## extract dates
dates <- regmatches(ll,gregexpr("[0-9]+\\/[0-9]+\\/[0-9]+",ll))
## remove dates
ll <- gsub("[0-9]+\\/[0-9]+\\/[0-9]+",'',ll)
## extract amounts like 120 or 120,1254
amounts <- regmatches(ll,gregexpr("\\$?[0-9]+(,[0-9]+)?",ll))
dates
[[1]]
[1] "1/05/2009" "3/1/2009"
[[2]]
[1] "1/05/2012"
> amounts
[[1]]
[1] "180000" "$150,250"
[[2]]
[1] "$300,400" "120" "145,25"
如果您想使用stringr
套餐,可以使用str_extract_all
执行相同操作。
str_extract_all(ll,"[0-9]+\\/[0-9]+\\/[0-9]+")
ll <- gsub("[0-9]+\\/[0-9]+\\/[0-9]+",'',ll)
str_extract_all(ll,"\\$?[0-9]+(,[0-9]+)?")
答案 1 :(得分:2)
如果没有看到许多可能的字符串,我认为很难给出答案。这里有一些指示。
阅读正则表达式。这些是模式匹配模板,您可以将这些模板应用于字符串并将匹配作为结果。例如,简单数字匹配“\ s [0-9] + \ s”之类的东西 - 它转换为空格字符,一个或多个数字,然后转换为另一个空格。如果您知道数字至少为3位数,请匹配“\ s [0-9] [0-9] [0-9] + \ s”。通过一些摆弄,您可以将现金金额与美元符号和嵌入式逗号相匹配。
您的日期与“[0-9] + / [0-9] + / [0-9] +”类似。当然,如果有人向你发出一个带有“01 / Jan / 2010”的字符串,那么你需要一个正则表达式来匹配它。
因此,找出可能发生的正则表达式,匹配它们,看看你得到了多少匹配。
R中的 help(regexp)
会让你开始。