我有调查问卷数据,参与者以各种格式输入他们的出生日期:
ID <- c(101,102,103,104,105,106,107)
dob <- c("20/04/2001","29/10/2000","September 1 2012","15/11/00","20.01.1999","April 20th 1999", "04/08/01")
df <- data.frame(ID, dob)
在进行任何分析之前,我需要能够在数据格式不正确时(即dd / mm / yr)对数据进行子集化,然后手动依次更正每个单元格。
我尝试使用:
df$dob <- strptime(dob, "%d/%m/%Y")
...要突出显示我的哪个日期格式正确,但我只是为输入错误的日期获取了NA,如果我想随后更改它们(使用ID作为参考),则无效。
有没有人有任何想法可以帮助我?
答案 0 :(得分:3)
查看lubridate
包。
library(lubridate)
parse_date_time(dob, c("dmy", "Bdy"))
# [1] "2001-04-20 UTC" "2000-10-29 UTC" "2012-09-01 UTC" "0000-11-15 UTC" "1999-01-20 UTC"
# [6] "1999-04-20 UTC" "0001-08-04 UTC"
答案 1 :(得分:-1)
免责声明:我不确定我是否完全理解你的问题。
在下面的代码段中,dob2将根据dob格式是否正确包含日期或NA。您应该能够过滤is.na(dob2)以获取不正确的数据。请注意,03/04/2013可以解释为3月3日或4月4日,但您似乎假设它是4月3日,所以我去了它。
ID <- c(101,102,103,104,105,106,107)
dob <- c("20/04/2001","29/10/2000","September 1 2012","15/11/00","20.01.1999","April 20th 1999", "04/08/01")
df <- data.table(ID, dob)
df[,dob2 := as.Date(dob, "%d/%m/%Y")]
编辑 - 增加了输出。顺便说一下,你也可以做df[is.na(as.Date(dob, "%d/%m/%Y"))]
ID dob dob2
1: 101 20/04/2001 2001-04-20
2: 102 29/10/2000 2000-10-29
3: 103 September 1 2012 <NA>
4: 104 15/11/00 0000-11-15
5: 105 20.01.1999 <NA>
6: 106 April 20th 1999 <NA>
7: 107 04/08/01 0001-08-04