我有一个包含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
Run Code Online (Sandbox Code Playgroud)
我想要的输出是
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
Run Code Online (Sandbox Code Playgroud)
我可以想到几个解决方案。天真的我建议使用applywith ?is.unsorted,这是:
测试对象是否未排序(以升序排列),而无需花费对其进行排序的费用。
!apply(dates, 1, is.unsorted)
#[1] TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
否则,请转换为长集,然后进行分组操作,这对于较大的数据集而言应该更快:
tmp <- cbind(row=seq_len(nrow(dates)), stack(lapply(dates, as.vector)))
!tapply(tmp$values, tmp$row, FUN=is.unsorted)
Run Code Online (Sandbox Code Playgroud)
最后,使用蛮力方法将每一列与下一个via进行比较Map,这种方法应该更快:
Reduce(`&`, Map(`<`, dates[-length(dates)], dates[-1]))
Run Code Online (Sandbox Code Playgroud)