2017-09-01 44 views
1

我有一個data.table像下面的一列的值:重複在data.table每個組的最後一排,改變

ID Date  v3 v4 
    1 2015.01.01 a 5 
    1 2015.02.01 b 5 
    1 2015.03.01 f 1 
    1 2015.04.01 z 5 
    1 2015.05.01 a 2 
    2 2013.03.01 a 6 
    2 2013.04.01 a 2 
    2 2013.05.01 g 13 
    2 2013.06.01 a 2 
    2 2013.07.01 e 8 
    2 2013.08.01 h 9 
    2 2013.09.01 h 9 

而且我想在每個組的末尾插入一行(通過ID),這將是一樣的最後一行日期除外,這應該是一個月,比上觀察:

ID Date  v3 v4 
    1 2015.01.01 a 5 
    1 2015.02.01 b 5 
    1 2015.03.01 f 1 
    1 2015.04.01 z 5 
    1 2015.05.01 a 2 
    1 2015.06.01 a 2 
    2 2013.03.01 a 6 
    2 2013.04.01 a 2 
    2 2013.05.01 g 13 
    2 2013.06.01 a 2 
    2 2013.07.01 e 8 
    2 2013.08.01 h 9 
    2 2013.09.01 h 9 

預先感謝您!

+1

請'輸入'您的數據示例。在提出涉及日期的問題時,這一點尤其重要。 – lmo

回答

1

我們可以提取最後一行,並與數據集rbind

library(data.table) 
library(lubridate) 
rbind(setDT(df1), df1[, Date := as.Date(Date, "%Y.%m.%d")][, 
     .SD[.N], ID][, Date := Date %m+% months(1)])[order(ID)] 
# ID  Date v3 v4 
# 1: 1 2015-01-01 a 5 
# 2: 1 2015-02-01 b 5 
# 3: 1 2015-03-01 f 1 
# 4: 1 2015-04-01 z 5 
# 5: 1 2015-05-01 a 2 
# 6: 1 2015-06-01 a 2 
# 7: 2 2013-03-01 a 6 
# 8: 2 2013-04-01 a 2 
# 9: 2 2013-05-01 g 13 
#10: 2 2013-06-01 a 2 
#11: 2 2013-07-01 e 8 
#12: 2 2013-08-01 h 9 
#13: 2 2013-09-01 h 9 
#14: 2 2013-10-01 h 9 

注:這可能是更好的「日期」轉換爲Date

或者像@Frank提到,seq.Datebase R可用於獲取「月」的序列

rbind(setDT(df1), df1[, Date := as.Date(Date, "%Y.%m.%d")][, 
    .SD[.N], ID][, Date := seq(Date, length.out = 2, by = 'month')[2], by = ID])[order(ID)] 
+1

不需要額外的軟件包,我猜可能是'seq(d,length.out = 2,by =「month」)'或其他東西。 (我沒有仔細閱讀OP。) – Frank