2017-10-26 12 views
0

私は数万のエントリを持つ日付変数を持つデータフレームを持っています。私は日付クラスの変数にすることができないか、またはそれをlubridate()で処理することができないので、どこかでデータ入力ミスがあるかもしれないと思います。ifelse()によるトラブルシューティングの日付

このMWEでは、最初の観測(a1)は、私の日付が予想される形式の正当な日付です。他の観測(a2〜a7)は、異なる種類のデータ入力ミスを表す。日付変数の各観測値をテストして、観測値が予想される形式の正当な日付かどうかを確認したいと思います。

私は正規のパターンとifelse()を使用しようとしましたが、コードを動作させることができません。私はdf2(データフレームである必要はありません)のようなものになりたいので、注意を必要とするかもしれない日付変数観測のIDを簡単に識別できます。どんな助けでも大歓迎です。

ポイント開始:

df1 <- data.frame(varID=c("a1","a2","a3","a4","a5","a6","a7"),varDate=c("01/01/2015","0101/2016","01/012017","35/01/2018","01/17/2019","01/01/20200","abc")) 

望ましい結果:

df2 <- data.frame(varID=c("a2","a3","a4","a5","a6","a7"),VarIssue=c("format issue","format issue","format issue","format issue","format issue","format issue")) 

現在のコード:

ifelse(df1$varDate == (^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$),"ok","format issue") 
+3

私はおそらく何かが不足していますが、 "ok" 'format'を使って' as.Date'を使って、NA( "フォーマット問題")を見つけてください: 'is.na(as.Date "%d /%m /%Y")) ' – Henrik

+0

私はそれを因子や文字に変えることができますが、それを日付クラス変数に変換することはできません。 – LLL

+0

@Henrik私はロジックが気に入っていますが、提供される正規表現は、 '/'、 '-'、または' .'をセパレータとして使用して複数の日付フォーマットを受け入れます。 – Mako212

答えて

2

2つの問題を、あなただけでは正規表現を使用することはできません、それが呼ばれる必要があります正規表現のパターンを受け入れる関数内で、代名詞を二重にエスケープする必要があります。 Rで

あなたがそうのような二重のエスケープを使用する必要があります:あなたのパターンになるので、\\dを:

pattern <- '^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d$' 

ザ・私たちはそれぞれの行をチェックする(論理ベクトルを返す)greplを使用します。

df1$check <- ifelse(grepl(pattern,df1$varDate)==TRUE,"ok", "format issue") 

    varID  varDate  check 
1 a1 01/01/2015   ok 
2 a2 0101/2016 format issue 
3 a3 01/012017 format issue 
4 a4 35/01/2018 format issue 
5 a5 01/17/2019 format issue 
6 a6 01/01/20200 format issue 
7 a7   abc format issue 
2

多分以下の話題はありませんが、日付書式に問題がある場合は、パッケージlubridatecharacterDate変換関数は多数の形式を認識しますトラブルの最初の兆候でそれをあきらめないでください。

library(lubridate) 

mdy(df1$varDate) 
#[1] "2015-01-01" "2016-01-01" "2017-01-01" NA   "2019-01-17" 
#[6] NA   NA   
#Warning message: 
# 3 failed to parse. 

あなただけ3 failed to parse.他人が正しくクラスDateに強制変換して見ることができるように。その後、はるかに単純なifelseを使用しますが、結果は明らかに非常に異なるでしょう。

df3 <- data.frame(varID = df1$varID) 
df3$VarIssue <- ifelse(is.na(mdy(df1$varDate)), "format issue", "ok") 
df3 
# varID  VarIssue 
#1 a1   ok 
#2 a2   ok 
#3 a3   ok 
#4 a4 format issue 
#5 a5   ok 
#6 a6 format issue 
#7 a7 format issue 

のみ3 "format issue"

関連する問題