【问题标题】:Rearrange Dates r重新排列日期 r
【发布时间】: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


    【解决方案1】:

    试试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
    

    【讨论】:

    • 感谢coalesce 函数,您能否将coalesce 与向量计算的执行时间比较,即conditionVal = as.Date(ifelse(!is.na(lag(test$c)),lag(test$c),lag(test$b))); test$a = as.Date(ifelse(is.na(conditionVal),test$a,conditionVal))
    • @ogiz,如果解决方案令人满意,您可以点击左侧接受它
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 2023-03-06
    • 2019-04-14
    • 1970-01-01
    • 2015-02-02
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多