2017-10-26 2 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"형식을 사용하여'as.Date'를 사용하지 말고'NA' ("형식 문제")를 찾으십시오 : is.na (as.Date ("% d/% m/% Y")) – Henrik

+0

인자 또는 문자로 변환 할 수는 있지만 날짜 클래스 변수로 변환 할 수는 없습니다. – LLL

+0

@Henrik 논리가 마음에 들지만 제공된 Regex는 구분 기호로'/','-' 또는'.'를 사용하여 여러 날짜 형식을 허용합니다. – Mako212

답변

2

두 가지 문제를, 당신은 혼자 정규식을 사용할 수 없습니다, 그것은 필요가 호출 될 Regex 패턴을 허용하는 함수 내에서 대명사 문자를 두 번 이스케이프 처리해야합니다. 당신의 패턴이가되도록, \\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 
를 R에서

당신과 같이 이중 탈출을 사용해야합니다
2

다음 주제가 맞지 않을 수 있지만 날짜 형식에 문제가있는 경우 패키지 lubridate을 사용하고 character에서 Date까지의 변환 함수는 많은 수의 forma 문제의 첫 징후에 그것을 포기하지 마십시오. 당신은 단지 3 failed to parse. 다른 사람을 볼 수 있듯이

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. 

제대로 클래스 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".