通过使用管道删除 NA 来融合多个 data.frame 日期字段
Fuse multiple data.frame date fields by removing NA using piping
我想在 R 中使用管道融合包含 NA 的多个日期字段。数据如下所示:
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
知道如何正确地做到这一点吗?
顺便说一句,我的问题与 this and this 不同,因为我想使用管道并且因为我的字段是日期字段,所以我不能将 sum
与 na.rm=T
.[=18 一起使用=]
谢谢
我们可以使用 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>
我想在 R 中使用管道融合包含 NA 的多个日期字段。数据如下所示:
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
知道如何正确地做到这一点吗?
顺便说一句,我的问题与 this and this 不同,因为我想使用管道并且因为我的字段是日期字段,所以我不能将 sum
与 na.rm=T
.[=18 一起使用=]
谢谢
我们可以使用 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>