通过使用管道删除NA来融合多个data.frame日期字段

时间:2017-12-10 17:07:25

标签: r dplyr piping

我想使用R中的管道来融合包含NAs的多个日期字段。数据如下所示:

dd <- data.frame(id=c("a","b","c","d"),
                  f1=as.Date(c(NA, "2012-03-24", NA,NA)),
                  f2=as.Date(c("2010-01-24", NA, NA,NA)),
                  f3=as.Date(c(NA, NA, "2014-11-22", NA)))
 dd
  id         f1         f2         f3
1  a       <NA> 2010-01-24       <NA>
2  b 2012-03-24       <NA>       <NA>
3  c       <NA>       <NA> 2014-11-22
4  d       <NA>       <NA>       <NA>

我知道如何以R基础方式做到这一点:

unlist(apply(dd[,c("f1","f2","f3")],1,na.omit))
          f2           f1           f3 
"2010-01-24" "2012-03-24" "2014-11-22" 

所以这不是我的问题。我正在学习管道和dplyr,所以我想管道这个功能。我试过了:

library(dplyr)
dd %>% mutate(f=na.omit(c(f1,f2,f3)))
Error in mutate_impl(.data, dots) : 
  Column `f` must be length 4 (the number of rows) or one, not 3

由于所有NA的线路,它不起作用。如果没有这一行,它就会起作用:

dd[-4,] %>% mutate(f=na.omit(c(f1,f2,f3)))
  id         f1         f2         f3          f
1  a       <NA> 2010-01-24       <NA> 2012-03-24
2  b 2012-03-24       <NA>       <NA> 2010-01-24
3  c       <NA>       <NA> 2014-11-22 2014-11-22

知道如何正确地做到这一点吗?

顺便说一句,我的问题与thisthis不同,因为我想使用管道,因为我的字段是日期字段,我不能将sumna.rm=T一起使用

由于

1 个答案:

答案 0 :(得分:2)

我们可以使用coalesce创建新列

library(dplyr)
dd %>%
   transmute(newcol = coalesce(f1, f2, f3)) #%>%
   #then `filter` the rows to remove the NA elements 
   #and `pull` as a `vector` (if needed) 
   #filter(!is.na(newcol)) %>%
   #pull(newcol)
#     newcol
#1 2010-01-24
#2 2012-03-24
#3 2014-11-22
#4       <NA>