r:当应用为.date()和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$date_contact中缺失的值替换为中的p$mr_daterd_fu1

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")

我们可以转换为Date类并使用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

通常,最好不要将ifelseDate类一起使用

您也可以尝试一下。您的数据有空格,这就是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

最新更新