【问题标题】:Verify that a sequence of dates are in the right order验证一系列日期的顺序是否正确
【发布时间】:2019-03-25 22:28:54
【问题描述】:

我有一个包含 4 列日期的数据框。应该是 col1 先出现,col2 第二出现,col3 第三,col4 最后出现。我想确定哪些行的日期不按顺序

这是一个玩具数据框

col1 <- c(as.Date("2004-1-1"), as.Date("2005-1-1"), as.Date("2006-1-1"))
col2 <- c(as.Date("2004-1-2"), as.Date("2005-1-3"), as.Date("2006-1-2"))
col3 <- c(as.Date("2004-1-5"), as.Date("2005-1-9"), as.Date("2006-1-19"))
col4 <- c(as.Date("2004-1-9"), as.Date("2005-1-15"), as.Date("2006-1-10"))
dates <- data.frame(col1, col2, col3, col4)

dates

    col1       col2       col3       col4
1 2004-01-01 2004-01-02 2004-01-05 2004-01-09
2 2005-01-01 2005-01-03 2005-01-09 2005-01-15
3 2006-01-01 2006-01-02 2006-01-19 2006-01-10

我想要的输出是,

    col1       col2       col3       col4       Seq?
1 2004-01-01 2004-01-02 2004-01-05 2004-01-09    T
2 2005-01-01 2005-01-03 2005-01-09 2005-01-15    T
3 2006-01-01 2006-01-02 2006-01-19 2006-01-10    F

【问题讨论】:

    标签: r date sequence


    【解决方案1】:

    我可以想到几个解决方案。我天真地建议使用apply?is.unsorted,即:

    测试一个对象是否没有排序(按升序),没有 排序成本。

    !apply(dates, 1, is.unsorted)
    #[1]  TRUE  TRUE FALSE
    

    否则,转换为长集,然后进行分组操作,在较大的数据集上应该会更快:

    tmp <- cbind(row=seq_len(nrow(dates)), stack(lapply(dates, as.vector)))
    !tapply(tmp$values, tmp$row, FUN=is.unsorted)
    

    最后,通过Map 将每一列与下一列进行比较的蛮力方法,应该会更快:

    Reduce(`&`, Map(`<`, dates[-length(dates)], dates[-1]))
    

    【讨论】:

    • 最后一个,可能do.call(pmin, Map(`&lt;`, dates[-length(dates)], dates[-1]))会稍微快一点
    • @d.b - 我的时间看起来差不多。它还将结果强制为c(1,1,0),而不是逻辑值。
    【解决方案2】:

    一个简单的apply 语句就可以解决问题:

    dates$Seq <- apply(dates, 1, function(x) all(x == sort(x)))
    

    【讨论】:

      【解决方案3】:
      rowSums(Reduce(pmax, dates, accumulate = TRUE) == dates) == NCOL(dates)
      #[1]  TRUE  TRUE FALSE
      

      Reducepmax 标识每行的连续最大日期。使用accumulate = TRUE,我们为每次迭代保留Reduce 的输出,并与dates 中的原始数据进行比较

      另一种方法,如果日期未排序,则引入NA

      !is.na(Reduce(function(x, y) ifelse(x > y | is.na(x), NA, y), dates))
      [1]  TRUE  TRUE FALSE
      

      【讨论】:

        猜你喜欢
        • 2016-07-22
        • 2011-11-07
        • 2016-01-25
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        相关资源
        最近更新 更多