将两列中的数据合并为一个更改日期格式

时间:2018-05-17 19:16:30

标签: r datetime

在数据框中,两列(fech_A和fech_B)包含不同原因的死亡日期。

   fech_A  fech_B  
1 8-02-06    <NA>  
2    <NA> 8-11-18  
3 9-03-14    <NA>  
4 9-03-05    <NA>  
5    <NA> 9-08-11  

我想将日期not-NA组合到一个新列fech_C中。根据以前发表的评论中的答案,我的代码是

fech_A <- as.Date(c("8-02-06",NA,"9-03-14","9-03-05",NA),format="%d/%m/%Y")
fech_B <- as.Date(c(NA,"8-11-18",NA,NA,"9-08-11"),format="%d/%m/%Y")
calend1 <- data_frame(fech_A,fech_B)
fech_C <- with(calend1,ifelse(is.na(fech_A),fech_A,fech_B)

但新列以数字格式显示:

[1] -716570 -716284 -716168 -716177 -716018

如何设置新列中的数据格式以显示为日期?

3 个答案:

答案 0 :(得分:1)

您可以使用行方式执行此操作。我已重写您的示例以修复错误:

fech_A <- as.Date(c("8-02-06",NA,"9-03-14","9-03-05",NA),format="%d-%m-%y")
fech_B <- as.Date(c(NA,"8-11-18",NA,NA,"9-08-11"),format="%d-%m-%y")
calend1 <- data_frame(fech_A,fech_B)

apply(calend1, 1, function(x) if (is.na(x['fech_A'])) {
    x['fech_B']
} else {
    x['fech_A']
})

[1] "2006-02-08" "2018-11-08" "2014-03-09" "2005-03-09" "2011-08-09"

我确定有更好的方法将列合并在一起,但这在基数R中干净利落,apply尊重您日期的数据类型。

答案 1 :(得分:0)

如果我没记错的话,问题在于if else,它将日期输出推广到整数(因为日期实际上存储为整数值,而NA是NA_integer_s。

我用来解决这个问题的方法是使用dplyr包,然后使用dplyr :: if_else。它们之间的区别在于dplyr :: if_else坚持true和false值属于同一类型,因此如果a和b绝对是日期,那么它可以安全地假设输出也是日期。

我怀疑你可以使用as.Date()强制键入输出if if else但是由于使用了dplyr选项(这对我来说很自然,因此我需要尝试这样的东西)使用整洁的经文进行大部分数据争论。)

答案 2 :(得分:0)

我们可以使用coalesce

library(tidyverse)
calend1 %>% 
   transmute(new = coalesce(!!! rlang::syms(names(.))))
# A tibble: 5 x 1
#  new       
#   <date>    
#1 2006-02-08
#2 2018-11-08
#3 2014-03-09
#4 2005-03-09
#5 2011-08-09