> 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 = 1
和Date.of.Txn = 09-11-2016
09-11-2016
ID = 1
上Txn的最后日期是25-10-2016
同样适用于
UID = 1
和Date.of.Txn 25-10-2016
25-10-2016
ID = 1
上的Txn的最后日期为30-08-2016
和
因为没有可用的日期
UID = 1
和Date 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
有什么想法吗?
答案 0 :(得分:0)
我认为所需要的是每个日期UID
内的时间日期。
定义一个prev_date
函数,给定一个日期向量,找到每个函数的前一个函数(如果没有,则找到NA)。将Date.of.Txn
转换为"Date"
类。最后使用prev_date
在UID
之前应用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