0

次のプロンプトが表示されました。

テキスト文字列のベクトル V.text が与えられた場合、各文字列から可能性の高い金額と日付を抽出し、それらを V.text と同じ長さのリストの個別のベクトル コンポーネントとして返す関数を記述します。金額と日付は、入力とまったく同じ形式のテキスト文字列として返される必要があります。たとえば、入力文字列の 1 つが「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 つの理由で不十分です。まず、2 つのベクトルを含むリストではなく、データ フレームを出力します。次に、入力テキスト文字列が変更された場合、私の解決策は役に立ちません。

受け取ったサポートに非常に感謝しています。

4

2 に答える 2

4

gregexprたとえば、 andを使用して前の回答のアイデアの例を示すには、次のように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]+)?")
于 2013-06-17T08:01:19.857 に答える
2

考えられる文字列の数を確認しないと、答えを出すのは難しいと思います。ここにいくつかの指針があります。

正規表現について読んでください。これらは、文字列に適用して結果として一致を取得するパターン マッチング テンプレートです。たとえば、単純な数字は "\s[0-9]+\s" のようなものと一致します。これは、スペース文字、1 つ以上の数字、さらに別のスペースとして変換されます。数字が 3 桁以上になることがわかっている場合は、「\s[0-9][0-9][0-9]+\s」で一致します。ちょっと手を加えるだけで、現金の金額をドル記号と埋め込まれたカンマと一致させることができます。

あなたの日付は「[0-9]+/[0-9]+/[0-9]+」のように一致します。もちろん、誰かが「01/Jan/2010」という文字列を投げてきた場合、それに一致する正規表現が必要です。

したがって、どの正規表現が発生する可能性が高いかを調べ、それらを照合し、一致する数を確認します。

help(regexp)R で開始できます。

于 2013-06-17T07:57:28.873 に答える