作为R格式错误子日期(Subset dates in the wrong format in R)

2019-10-18 16:46发布

我有与会者都输入自己的出生日期在各种各样的格式问卷数据:

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 /年),然后手动校正依次在每个细胞中。

我试着使用:

df$dob <- strptime(dob, "%d/%m/%Y")

...突出其我的日期是正确的格式,但我只是得到NAS进行不正确地输入的日期,如果我想后来改变他们(使用ID作为参考),这是没有帮助的。

有没有人有可能能够帮助我的任何想法?

Answer 1:

退房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"


Answer 2:

免责声明:我不知道我是否完全了解你的问题。

在下面的代码片段,dob2将包含基于DOB是否处于正确格式的日期或NA。 你应该能够筛选is.na(dob2)得到不正确的数据。 需要注意的是2013年3月4日可以解释为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


文章来源: Subset dates in the wrong format in R