1

我有问卷数据,参与者以多种格式输入了他们的出生日期:

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 作为参考),这将无济于事。

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

4

2 回答 2

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"
于 2013-09-26T12:27:34.890 回答
-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
于 2013-09-26T12:29:05.010 回答