【问题标题】:Joining data from two columns into one changes date format将两列中的数据合并为一列更改日期格式
【发布时间】:2018-05-27 02:03:13
【问题描述】:

在一个数据框中,两列(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  

我想将非 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

如何将新列中的数据格式化为日期?

【问题讨论】:

  • 你有calend和calend1,它们是一样的吗?这是一个错字吗?您的 fech_C 语句也缺少 )
  • 首先,您的format= 参数是错误的。他们应该是,format="%d-%m-%y"。您需要-,因为这是您使用的分隔符(不是/),您需要%y(小写),因为您有两位数的年份
  • 对不起,G5W。我已更正错字,而不是calend1。

标签: r datetime


【解决方案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 尊重您的日期的数据类型。

【讨论】:

    【解决方案2】:

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

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

    我怀疑您可以在 if else 周围使用 as.Date() 强制键入输出,但由于使用 dplyr 选项(这对我来说很自然,因为我使用大部分数据争论的整洁诗句)。

    【讨论】:

    • 谢谢。您的建议为优雅的解决方案提供了一些想法。
    【解决方案3】:

    我们可以使用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
    

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2015-06-03
      • 2022-08-12
      • 1970-01-01
      相关资源
      最近更新 更多