R 重新安排日期

R 重新安排日期,r,R,我有三列日期 test <- data.frame(a = as.Date(rep("2008-02-04", 5)), b = as.Date(c("2010-01-25", "2012-04-13", "2013-04-04", "2013-09-06",

我有三列日期

test <- data.frame(a = as.Date(rep("2008-02-04", 5)),
               b = as.Date(c("2010-01-25",
                             "2012-04-13",
                             "2013-04-04",
                             "2013-09-06",
                             "2014-08-14")),
               c = as.Date(c("2010-01-29",
                             "2012-04-16",
                             NA,
                             "2013-09-19",
                             "2014-08-21"))); test
           a          b          c
1 2008-02-04 2010-01-25 2010-01-29
2 2008-02-04 2012-04-13 2012-04-16
3 2008-02-04 2013-04-04       <NA>
4 2008-02-04 2013-09-06 2013-09-19
5 2008-02-04 2014-08-14 2014-08-21
但对于a行中的第一项,它总是返回NA:

           a          b          c
1       <NA> 2010-01-25 2010-01-29
2 2010-01-29 2012-04-13 2012-04-16
3 2012-04-16 2013-04-04       <NA>
4 2013-04-04 2013-09-06 2013-09-19
5 2013-09-19 2014-08-14 2014-08-21
abc
1        2010-01-25 2010-01-29
2 2010-01-29 2012-04-13 2012-04-16
3 2012-04-16 2013-04-04       
4 2013-04-04 2013-09-06 2013-09-19
5 2013-09-19 2014-08-14 2014-08-21

试试
dplyr::coalesce
。它返回其参数中的第一个非NA值(按组件):

test %>% mutate(a = coalesce(lag(c), lag(b), a))
给予:

           a          b          c
1 2008-02-04 2010-01-25 2010-01-29
2 2010-01-29 2012-04-13 2012-04-16
3 2012-04-16 2013-04-04       <NA>
4 2013-04-04 2013-09-06 2013-09-19
5 2013-09-19 2014-08-14 2014-08-21
abc
1 2008-02-04 2010-01-25 2010-01-29
2 2010-01-29 2012-04-13 2012-04-16
3 2012-04-16 2013-04-04       
4 2013-04-04 2013-09-06 2013-09-19
5 2013-09-19 2014-08-14 2014-08-21

感谢使用
coalesce
功能,您是否可以将
coalesce
与向量计算的执行时间进行比较,即
conditionVal=as.Date(ifelse(!is.na(滞后(测试$c))、滞后(测试$c)、滞后(测试$b));test$a=as.Date(ifelse(is.na(conditionVal),test$a,conditionVal))
@ogiz,如果解决方案令人满意,您可以单击左侧接受它
           a          b          c
1       <NA> 2010-01-25 2010-01-29
2 2010-01-29 2012-04-13 2012-04-16
3 2012-04-16 2013-04-04       <NA>
4 2013-04-04 2013-09-06 2013-09-19
5 2013-09-19 2014-08-14 2014-08-21
test %>% mutate(a = coalesce(lag(c), lag(b), a))
           a          b          c
1 2008-02-04 2010-01-25 2010-01-29
2 2010-01-29 2012-04-13 2012-04-16
3 2012-04-16 2013-04-04       <NA>
4 2013-04-04 2013-09-06 2013-09-19
5 2013-09-19 2014-08-14 2014-08-21