在R语言中如何合并两列:用非NA值填充另一列的NA值
合并数据框两列,用非NA值填充NA生成新列
这个需求其实很常见,针对你给出的数据框,我整理了两种R语言下的实现方案,都能快速得到目标结果:
先构造示例数据
首先我们先还原你的初始数据框(注意要把字符串转成日期类型,否则后续处理可能出问题):
df <- data.frame( date1 = as.POSIXct(c("2016-08-29 02:31:34", NA)), date2 = as.POSIXct(c(NA, "2016-08-29 17:59:23")) )
方案1:用dplyr的coalesce函数(推荐)
dplyr包里的coalesce函数就是专门干这个的——它会逐行从多个向量中提取第一个非NA值,完全匹配你的需求,代码简洁还不会踩类型转换的坑:
library(dplyr) df <- df %>% mutate(Newdate = coalesce(date1, date2))
方案2:Base R原生实现(无需额外包)
如果你不想加载第三方包,也可以用原生函数实现:
方法A:ifelse判断
# 先判断date1是否非NA,是就取date1,否则取date2 df$Newdate <- ifelse(!is.na(df$date1), df$date1, df$date2) # 注意:ifelse会把日期转成数值,所以要再转回来 df$Newdate <- as.POSIXct(df$Newdate, origin = "1970-01-01")
方法B:apply逐行处理
# 逐行筛选非NA值 df$Newdate <- apply(df[, c("date1", "date2")], 1, function(x) x[!is.na(x)]) # 转成日期类型 df$Newdate <- as.POSIXct(df$Newdate)
最终结果
不管用哪种方法,运行后你都会得到目标数据框:
print(df) # 输出: # date1 date2 Newdate # 1 2016-08-29 02:31:34 <NA> 2016-08-29 02:31:34 # 2 <NA> 2016-08-29 17:59:23 2016-08-29 17:59:23
内容的提问来源于stack exchange,提问作者ajax
相关产品推荐
相关产品推荐

