2016-11-09 3 views
0
> 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は、最後の2番目の日付w.r.t.を返す必要があります。列Date.of.Txnの値に変更します。 ID = 1ため UID = 1Date.of.Txn = 09-11-2016最後の二日目を返す

09-11-2016上TXNの最後の日のために例えば

については

UID = 1Date.of.Txn 25-10-2016 ID = 1ため25-10-2016上TXNの最後の日のために25-10-2016 も同様でしたは30-08-2016

以下に示すようにDatesorted列の値が0なり UID = 1Date of Txn = 30-08-2016 ために利用可能な日付が存在しないように。

> 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 

+1

dplyrとその進み/遅れ関数を使用できます。 https://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html – PhillipD

答えて

0

これも動作します(出力の日付形式を変更することなく):

do.call(rbind, lapply(split(a, a$UID), function(x){ 
    x <- x[order(as.Date(as.character(x$Date.of.Txn), format='%d-%m-%Y'), decreasing=TRUE),] 
    x$Datesorted <- c(as.character(x$Date.of.Txn[2:nrow(x)]),'0')  
    x})) 

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

サンデパンに感謝します。あなたはコードを説明していただけますか? –

+0

必ず@pankaj。最初に、UIDでデータを分割する必要があります。各UIDに対してデータフレームがあります。次に、各データフレームを並べ替えます。指定されたUIDの最初に現れる日付が実際に最後の日付(w.r.t時間)であることを確認するために、時間の降順で時間をソートします(まだソートされていない場合)。次に、Datesorted列に、Date.of.Txn列の遅れたバージョンを追加し、追加のゼロを追加する必要があります。 –

0

私は、それぞれの日付について、UIDの範囲内の先の日付が時間的に欲しいと集める。

prev_date関数を定義します。これは、日付のベクトルを前提とすると、それぞれの以前のベクトルを求めます(存在しない場合はNA)。 Date.of.Txn"Date"に変換してください。最後に、prev_dateUIDbyを使用して適用します。パッケージは使用されません。

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")) 
関連する問題