返回第二个日期

时间:2016-11-09 11:27:37

标签: r datetime

> a
   UID Date.of.Txn
1    1  09-11-2016
2    1  25-10-2016
3    1  30-08-2016
4    2  30-08-2016
5    2  02-06-2016
6    3  18-04-2016
7    3  31-01-2016
8    4  03-11-2015
9    4  06-08-2015
10   5  20-05-2015
11   5  08-05-2015

我想要的是每个UID需要返回第二个日期w.r.t.列Date.of.Txn中的值。

例如

UID = 1Date.of.Txn = 09-11-2016

09-11-2016 ID = 1上Txn的最后日期是25-10-2016 同样适用于

UID = 1Date.of.Txn 25-10-2016 25-10-2016 ID = 1上的Txn的最后日期为30-08-2016

因为没有可用的日期 UID = 1Date of Txn = 30-08-2016 Datesorted列中的值为0,如下所示。

> result
   UID Date.of.Txn Datesorted
1    1  09-11-2016 25-10-2016
2    1  25-10-2016 30-08-2016
3    1  30-08-2016          0
4    2  30-08-2016 02-06-2016
5    2  02-06-2016          0
6    3  18-04-2016 31-01-2016
7    3  31-01-2016          0
8    4  03-11-2015 06-08-2015
9    4  06-08-2015          0
10   5  20-05-2015 08-05-2015
11   5  08-05-2015          0

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为所需要的是每个日期UID内的时间日期。

定义一个prev_date函数,给定一个日期向量,找到每个函数的前一个函数(如果没有,则找到NA)。将Date.of.Txn转换为"Date"类。最后使用prev_dateUID之前应用by。没有包使用。

prev_date <- function(d) {
   do.call("c", lapply(d, function(d0) if (any(d < d0)) max(d[d < d0]) else NA))
}

a2 <- transform(a, Date.of.Txn = as.Date(Date.of.Txn, "%d-%m-%Y"))
do.call("rbind", by(a2, a2$UID, transform, prev_date = prev_date(Date.of.Txn)))

结果是:

     UID Date.of.Txn  prev_date
1.1    1  2016-11-09 2016-10-25
1.2    1  2016-10-25 2016-08-30
1.3    1  2016-08-30       <NA>
2.4    2  2016-08-30 2016-06-02
2.5    2  2016-06-02       <NA>
3.6    3  2016-04-18 2016-01-31
3.7    3  2016-01-31       <NA>
4.8    4  2015-11-03 2015-08-06
4.9    4  2015-08-06       <NA>
5.10   5  2015-05-20 2015-05-08
5.11   5  2015-05-08       <NA>

注意:可重复形式的输入a(应在问题中提供)是:

a <- structure(list(UID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 
5L), Date.of.Txn = structure(c(5L, 8L, 9L, 9L, 1L, 6L, 10L, 2L, 
3L, 7L, 4L), .Label = c("02-06-2016", "03-11-2015", "06-08-2015", 
"08-05-2015", "09-11-2016", "18-04-2016", "20-05-2015", "25-10-2016", 
"30-08-2016", "31-01-2016"), class = "factor")), .Names = c("UID", 
"Date.of.Txn"), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10", "11"))

答案 1 :(得分:0)

这也可以(不改变输出中的日期格式):

SELECT * FROM table A WHERE ID = '123456' --return record without issue
SELECT * FROM table B WHERE ID = '123456' --return record without issue