2016-06-18 11 views
1

私は以下のように文字列のベクトルを持っています。私は日付を抽出したい。文字列から日付を抽出するR

check_values <- c("deficit based on wage statement 7/14/ to 7/17/2015", 
       "Deficit Due: $1205.73 -$879.63= $326.10 x 70%=$228.2", 
       "Deficit Due for 12 wks pd - 7/14/15 thru 10/5/15;", 
       "Deficit due to wage statement: 4/22/15 thru 5/12/15", 
       "depos transcript 7/10/15 for 7/8/15 depos", 
       "difference owed for 4/25/15-5/22/15", 
       "tpd 4:30:2015 - 5:22:2015", 
       "Medical TREATMENT DATES: 6/30/2015 - 6/30/2015", 
       "4/25/15-5/22/15", 
       "Medical") 

       check_values <- as.data.table(check_values) 
       names(check_values) <- "check_memo" 

日付を抽出する前に、Date_Flagを作成します。私は、次のコードを使用しているが、それは異なる出力が得られます。このDate_Flagが作成され

check_values$Date_Flag <- ifelse(grepl("([0-9]+)(/|-|:)([0-9]+)(/|-|:)([0-9]+)(/|-|:)", check_values$check_memo), 1, 0) 
#[1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE 
#Expected Output: FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 

した後、私は日付(両方の部分)を抽出したいです。誰かが上記の正規の回帰に間違っていることを教えてもらえますか?

おかげ

+0

と同じパターンを使用する正規表現は最後にこれを持っている: '| - |:'、それは以降の主な問題です(/) '/'、 '-'、': 'の順で日付のほんの一部が続きます。それが問題です。また、不要な 'ifelse'ステートメントを使用しているときにも、キャプチャグループを使用しています。 'grepl'はTRUEまたはFALSEを返します。 'ifelse'を使う必要はありません。 – Jota

+0

@Jota - 私のスクリプトに関する問題を指摘してくれてありがとう。あなたは(/ | :)と[/:]の正確な違いを説明できますか?なぜ、1つは働き、他は働かないのですか? ifelseは必要ないと私はあなたに同意します。さらに、[0-9] {1,2}の代わりに[0-9] +を使用できないのはなぜですか? 2番目の数字は桁数を制限しますが、私の目的は両方で達成可能でなければなりません。私が間違っているなら、私を修正してください。 – skumar

+0

質問はあなたの質問の完全な説明のための適切な場所ではありませんが、私はいくつかの検索語を提案します。角括弧は[文字クラス](http://www.regular-expressions.info/charclass.html)で使用され、かっこは[取り込みとグループ化]に使用されます(http://www.regular-expressions.info/ brackets.html)。また、 '?regex'ヘルプページを見て、もっと学ぶための正規表現についてのチュートリアルを探してください。その後も疑問が残っている場合は、新しい質問を投稿することを検討してください。 – Jota

答えて

2

我々は仮定が「check_memo」の各要素における2つのフル日付が存在する場合、我々はTRUEまたは他FALSE得るということである「Date_Flag」を作成するためにstr_countを使用することができます。

library(data.table) 
library(stringr) 
pat <- "[0-9]{1,2}[/:][0-9]{1,2}[/:][0-9]{2,4}" 
check_values[,Date_Flag := str_count(check_memo, pat)==2] 
check_values 
#            check_memo Date_Flag 
#1: deficit based on wage statement 7/14/ to 7/17/2015  FALSE 
#2: Deficit Due: $1205.73 -$879.63= $326.10 x 70%=$228.2  FALSE 
#3: Deficit Due for 12 wks pd - 7/14/15 thru 10/5/15;  TRUE 
#4: Deficit due to wage statement: 4/22/15 thru 5/12/15  TRUE 
#5:   depos transcript 7/10/15 for 7/8/15 depos  TRUE 
#6:     difference owed for 4/25/15-5/22/15  TRUE 
#7:       tpd 4:30:2015 - 5:22:2015  TRUE 
#8:  Medical TREATMENT DATES: 6/30/2015 - 6/30/2015  TRUE 
#9:          4/25/15-5/22/15  TRUE 
#10:            Medical  FALSE 

我々が抽出された日付が必要な場合は、str_extract_all

check_values[(Date_Flag), paste0("Date", 1:2) := 
        transpose(str_extract_all(check_memo, pat))] 

check_values 
               check_memo #Date_Flag  Date1  Date2 
# 1: deficit based on wage statement 7/14/ to 7/17/2015  FALSE  NA  NA 
# 2: Deficit Due: $1205.73 -$879.63= $326.10 x 70%=$228.2  FALSE  NA  NA 
# 3: Deficit Due for 12 wks pd - 7/14/15 thru 10/5/15;  TRUE 7/14/15 10/5/15 
# 4: Deficit due to wage statement: 4/22/15 thru 5/12/15  TRUE 4/22/15 5/12/15 
# 5:   depos transcript 7/10/15 for 7/8/15 depos  TRUE 7/10/15 7/8/15 
# 6:     difference owed for 4/25/15-5/22/15  TRUE 4/25/15 5/22/15 
# 7:       tpd 4:30:2015 - 5:22:2015  TRUE 4:30:2015 5:22:2015 
# 8:  Medical TREATMENT DATES: 6/30/2015 - 6/30/2015  TRUE 6/30/2015 6/30/2015 
# 9:          4/25/15-5/22/15  TRUE 4/25/15 5/22/15 
#10:            Medical  FALSE  NA  NA 
+1

この詳細な返信にはどうもありがとうございます。これは本当に役に立ちます。他の質問の場合、私は投稿します。 – skumar

関連する問題