R:用于搜索文本字符串并在两个向量中返回日期和价格的函数

时间:2013-06-17 07:36:48

标签: string r list text dataframe

我收到了以下提示:

  

给定一个文本字符串向量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
}

这个解决方案有两个原因。首先,它输出数据帧而不是包含两个向量的列表。其次,如果输入文本字符串发生变化,我的解决方案就没用了。

如果得到任何支持,我将非常感激。

2 个答案:

答案 0 :(得分:4)

例如,使用gregexprregmatches举例说明上一个答案提示:

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)会让你开始。