合并DataFrame两列日期至新列后格式变为数值,如何转为日期格式?
解决日期合并后变为数值格式的问题
我来帮你搞定这个问题——你遇到的其实是R中日期类型处理的一个常见小坑,咱们一步步理清楚:
首先,先指出你代码里的两个小问题:
- 逻辑写反了:你写的
ifelse(is.na(fech_A), fech_A, fech_B)意思是「如果fech_A是NA,就返回fech_A(还是NA),否则返回fech_B」,这和你想要的「取两列中非NA的日期」完全相反,应该改成ifelse(is.na(fech_A), fech_B, fech_A)——也就是fech_A非空就用fech_A,否则用fech_B。 - 语法错误:代码最后少了一个闭合括号,运行时会直接报错。
为什么fech_C会变成数值?
在R里,Date类型本质是用整数存储的——这个整数代表从1970年1月1日开始计算的天数。而ifelse函数有个特性:它会自动把输入转换为最「基础」的数据类型,所以处理日期时,会把日期转成对应的整数数值返回,这就是你看到那些奇怪数字的原因。
两种解决方法
方法1:用dplyr::coalesce(推荐)
coalesce函数专门用来从多个列中取第一个非NA的值,而且会保留原始数据类型,完全不会出现转成数值的问题。另外还要注意:你原来的日期格式参数写错了,字符串是-分隔的,所以format要改成"%d-%m-%Y":
library(dplyr) # 先创建正确的日期数据框 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 calend1 <- calend1 %>% mutate(fech_C = coalesce(fech_A, fech_B))
方法2:修复ifelse并转换回日期格式
如果你不想用dplyr,也可以把ifelse返回的数值重新转换为日期类型,只需要指定R日期的默认原点origin="1970-01-01":
# 修正ifelse逻辑并转换 fech_C <- with(calend1, ifelse(is.na(fech_A), fech_B, fech_A)) fech_C <- as.Date(fech_C, origin = "1970-01-01") # 将fech_C加入数据框 calend1$fech_C <- fech_C
这样处理后,fech_C就会显示为正常的日期格式了。
内容的提问来源于stack exchange,提问作者Juan_Ramon Lacalle
相关产品推荐
相关产品推荐

