r: 为什么在应用 as.Date() 和 origin 时字符串显示日期而不是日期?

r: why is character string showing days and not date when applying as.Date() and origin?

我有

> head(p, 10)
   date_contact mr_daterd_fu1
1                  11.10.2012
2                            
3                            
4                            
5    13.12.1994              
6                            
7    20.03.2012    20.03.2012
8    25.08.1999              
9    25.05.2012    25.05.2012
10   19.10.2007 

我需要用 p$mr_daterd_fu1 替换 p$date_contact 中的缺失值,如

fu1_date = ifelse(is.na(date_contact), 
                  as.Date(mr_daterd_fu1,  format = '%d.%m.%Y'),
                  as.Date(date_contact,  format = '%d.%m.%Y')))

但这给了

> head(p, 10)
   date_contact mr_daterd_fu1 fu1_date
1                  11.10.2012       NA
2                                   NA
3                                   NA
4                                   NA
5    13.12.1994                   9112
6                                   NA
7    20.03.2012    20.03.2012    15419
8    25.08.1999                  10828
9    25.05.2012    25.05.2012    15485
10   19.10.2007                  13805

> str(p)
'data.frame':   946 obs. of  3 variables:
 $ date_contact : chr  "" "" "" "" ...
 $ mr_daterd_fu1: chr  "11.10.2012" "" "" "" ...
 $ fu1_date     : num  NA NA NA NA 9112 ...

为什么p$fu1_date不显示as.Date

我试过了

 p %>% mutate(mr_daterd_fu1 = as.Date(mr_daterd_fu1,  format = '%d.%m.%Y'),
         fu1_date = ifelse(is.na(date_contact), 
                    mr_daterd_fu1,
                    as.Date(date_contact,  format = '%d.%m.%Y', origin=mr_daterd_fu1)))

但这没有用。

预期输出:

   date_contact mr_daterd_fu1    fu1_date
1                  11.10.2012  2012.10.11
2                                      NA
3                                      NA
4                                      NA
5    13.12.1994                1994.12.13
6                                      NA
7    20.03.2012    20.03.2012  2012.03.20
8    25.08.1999                1999.08.25
9    25.05.2012    25.05.2012  2012.05.25
10   19.10.2007                2007.10.19

数据

p <- structure(list(date_contact = c("", "", "", "", "13.12.1994", 
"", "20.03.2012", "25.08.1999", "25.05.2012", "19.10.2007"), 
    mr_daterd_fu1 = c("11.10.2012", "", "", "", "", "", "20.03.2012", 
    "", "25.05.2012", "")), row.names = c(NA, 10L), class = "data.frame")

我们可以转换为Dateclass并使用coalesce

library(dplyr)
p %>%
   mutate(across(c(date_contact, mr_daterd_fu1),
           as.Date, format = "%d.%m.%Y")) %>% 
   mutate(ful_date  = coalesce(date_contact, mr_daterd_fu1 ))

-输出

#  date_contact mr_daterd_fu1   ful_date
#1          <NA>    2012-10-11 2012-10-11
#2          <NA>          <NA>       <NA>
#3          <NA>          <NA>       <NA>
#4          <NA>          <NA>       <NA>
#5    1994-12-13          <NA> 1994-12-13
#6          <NA>          <NA>       <NA>
#7    2012-03-20    2012-03-20 2012-03-20
#8    1999-08-25          <NA> 1999-08-25
#9    2012-05-25    2012-05-25 2012-05-25
#10   2007-10-19          <NA> 2007-10-19

一般来说,ifelse最好不要和Date一起使用class

你也可以试试这个。您的数据有空格,这就是 is.na() 不起作用的原因:

library(dplyr)
#Code
p %>% mutate(mr_daterd_fu1 = as.Date(mr_daterd_fu1,  format = '%d.%m.%Y'),
             fu1_date = if_else(date_contact=='', 
                               mr_daterd_fu1,
                               as.Date(date_contact,  format = '%d.%m.%Y', origin=mr_daterd_fu1)))

输出:

   date_contact mr_daterd_fu1   fu1_date
1                  2012-10-11 2012-10-11
2                        <NA>       <NA>
3                        <NA>       <NA>
4                        <NA>       <NA>
5    13.12.1994          <NA> 1994-12-13
6                        <NA>       <NA>
7    20.03.2012    2012-03-20 2012-03-20
8    25.08.1999          <NA> 1999-08-25
9    25.05.2012    2012-05-25 2012-05-25
10   19.10.2007          <NA> 2007-10-19