【发布时间】:2017-01-19 12:10:51
【问题描述】:
我有三列日期。
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 值替换为前一行的 C 值。如果上一行 C 为 NA,则取上一行 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
到目前为止,我已经用 for 循环解决了这个问题:
n <- nrow(test)
if (n > 1) {
for (i in 1:(n - 1)) {
empty <- is.na(test$c[i])
if (empty)
test$a[i + 1] <- test$b[i]
else
test$a[i + 1] <- test$c[i]
}
}
我想知道使用 dplyr 包是否有更快的方法来做到这一点。我想将 mutate 与 ifelse 语句一起使用,但我不知道如何为要更改的变量选择 i+1。我尝试执行以下操作:
test %>% mutate(a = if_else(is.na(lag(c, n = 1)),
true = lag(b, n = 1),
false = lag(c, n = 1),
missing = a))
但这总是为 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
【问题讨论】:
标签: r