2017-12-13 15 views
2

다음과 같은 날짜가 포함 된 문자 개체가 있습니다.누락 날짜를 이전 항목으로 채우기

Dec-13-17 06:38AM 
Dec-11-17 07:30AM 
06:35AM 
06:20AM 
06:15AM 
Dec-09-17 01:22PM 
Dec-08-17 11:46AM 
05:20AM 
Dec-08-17 09:38AM 

문제점 이러한 항목 중 일부에 날짜 값이 누락되었습니다. 6:35, 6:20 & 5:15은 ​​모두 Dec-11-17에 누락되어 있으며 05:20 AM은 12 월 8 일 -17 일에 누락되었습니다.

필자는 str_count()을 사용하여 다음 전체 datetime을 찾은 다음 gsub를 사용하여 날짜 부분 만 추출한 다음 다음과 같은 기존 시간 항목을 붙여 다음 ifterse 문을 항상 썼습니다.

paste0(gsub(" .*$", "", datetime), <existingdate>) 

그것의 아주 지저분가 문 ifelse 중첩 많이 포함하지만, 문제는 내가에서 날짜를 추출보고있다 불완전한 항목 위의 얼마나 많은 행을 결코 알지 못할 것입니다있다. 이 데이터는 웹에서 긁어내어 내 문장을 처리 할 수있을 정도로 길어질 수 있으므로이 작업을 수행하는 더 좋은 방법이 있다고 확신합니다.

많은 도움을 주셨습니다.

+0

문제 해결에 도움이되는 답변을 수락하십시오. – PoGibas

답변

2

입력이 s 인 것으로 가정하면 반환하는 날짜를 추출하거나 그렇지 않은 경우 NA는 dat이됩니다. 또한 tim의 시간을 추출하십시오. 날짜에 na.locf을 실행하여 누락 된 날짜를 채우고 날짜와 시간을 붙여 넣습니다.

s <- c("Dec-13-17 06:38AM", "Dec-11-17 07:30AM", "06:35AM", "06:20AM", 
    "06:15AM", "Dec-09-17 01:22PM", "Dec-08-17 11:46AM", "05:20AM", 
    "Dec-08-17 09:38AM") 

library(zoo) 
dat <- ifelse(grepl("-", s), sub(" .*", "", s), NA) 
tim = sub(".* ", "", s) 
dattim <- paste(na.locf(dat), tim) 
as.POSIXct(dattim, format = "%b-%d-%y %I:%M%p") 

제공 :

[1] "2017-12-13 06:38:00 EST" "2017-12-11 07:30:00 EST" 
[3] "2017-12-11 06:35:00 EST" "2017-12-11 06:20:00 EST" 
[5] "2017-12-11 06:15:00 EST" "2017-12-09 13:22:00 EST" 
[7] "2017-12-08 11:46:00 EST" "2017-12-08 05:20:00 EST" 
[9] "2017-12-08 09:38:00 EST" 
1

먼저 MDY 정보가없는 항목을 NA를 얻을. 그런 다음 tidyr::fill을 사용하여 이전 입력 내용 인 NA을 입력하십시오.

# Using OPs data stored in df (column V1) 
foo <- ifelse(grepl("^[A-z]", df$V1), sub(" .*", "", df$V1), NA) 
# [1] "Dec-13-17" "Dec-11-17" NA   NA   NA   "Dec-09-17" 
# [7] "Dec-08-17" NA   "Dec-08-17" 

library(dplyr) 
library(tidyr) 
data.frame(foo) %>% 
    fill(foo) %>% 
    mutate(foo = paste(foo, sub(".* ", "", df$V1))) 

#     foo 
# 1 Dec-13-17 06:38AM 
# 2 Dec-11-17 07:30AM 
# 3 Dec-11-17 06:35AM 
# 4 Dec-11-17 06:20AM 
# 5 Dec-11-17 06:15AM 
# 6 Dec-09-17 01:22PM 
# 7 Dec-08-17 11:46AM 
# 8 Dec-08-17 05:20AM 
# 9 Dec-08-17 09:38AM