在数据框中,两列(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
如何设置新列中的数据格式以显示为日期?
答案 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