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