通过R中的id将一组观察转移到下一组

通过R中的id将一组观察转移到下一组,r,date,dplyr,data.table,data-manipulation,R,Date,Dplyr,Data.table,Data Manipulation,假设我有这样一个数据帧: 合同 最后一个日期。最后一个价格。价格。1 id携带 1 1998-11-3094.5098.50QS-0.040609137 2 1998-11-30 31.32.13 HO-0.025210084 3 1998-12-3195.5098.00QS-0.025510204 4 1998-12-3134.0034.28HO-0.008168028 5 1999-01-29100.00100.50QS-0.004975124 6 1999-01-29 33.16 33.4

假设我有这样一个数据帧:

合同
最后一个日期。最后一个价格。价格。1 id携带
1 1998-11-3094.5098.50QS-0.040609137
2 1998-11-30 31.32.13 HO-0.025210084
3 1998-12-3195.5098.00QS-0.025510204
4 1998-12-3134.0034.28HO-0.008168028
5 1999-01-29100.00100.50QS-0.004975124
6 1999-01-29 33.16 33.42 HO-0.007779773
7 1999-02-26 100.25 100.25 QS 0.000000000
8 1999-02-26 32.29 32.37 HO-0.002471424
9 1999-02-26 10.8811.00一氧化碳-0.0109091
10 1999-03-31 131.50 130.75 QS 0.005736138
11 1999-03-3144.6844.00HO0.01545
12 1999-03-31 15.24 15.16 CO 0.005277045
我想计算每个月每个id的权重。我有一个函数可以做到这一点。我使用dplyr来实现这一点:

库(dplyr)
图书馆(lubridate)
合同%
突变(日期=ymd(日期))%>%
分组依据(日期)%>%
变异(重量=重量(进位))
其中:

合同
日期最后。价格最后。价格。1 id携带重量
1 1998-11-30 94.5098.50QS-0.040609137 0.616979910
2 1998-11-30 31.32 32.13 HO-0.025210084 0.383020090
3 1998-12-3195.5098.00QS-0.025510204 0.757468623
4 1998-12-3134.034.28HO-0.008168028 0.242531377
5 1999-01-29100.00100.50QS-0.0049751240.390056023
6 1999-01-29 33.16 33.42 HO-0.007779773 0.609943977
7 1999-02-26 100.25100.25QS 0.000000000纳
8 1999-02-26 32.29 32.37 HO-0.002471424 0.184703218
9 1999-02-26 10.8811.00一氧化碳-0.010909091 0.815296782
10 1999-03-31 131.50 130.75 QS 0.057361377 0.057361377
11 1999-03-3144.6844.00HO0.01545 0.01545
12 1999-03-31 15.24 15.16 CO 0.005277045 0.005277045
现在我想要权重的滞后,这样在11月计算的权重在12月应用。所以我基本上想按组移动权重列,组就是日期。所以11月份的值最终是12月份的值,依此类推

现在我还希望移位按id匹配,这样,如果包含一个新id,第一次出现id的组将在滞后列中有一个NA

所需输出如下所示:

所需
最后日期。最后价格。价格。1 id携带重量w
1 1998-11-30 94.50 98.50 QS-0.040609137 0.616979910 NA
2 1998-11-30 31.32 32.13 HO-0.025210084 0.383020090 NA
3 1998-12-3195.5098.00QS-0.025510204 0.757468623 0.61697991
4 1998-12-3134.0034.28HO-0.008168028 0.242531377 0.38302009
5 1999-01-29100.00100.50QS-0.0049751240.390056023 0.75746862
6 1999-01-29 33.16 33.42 HO-0.007779773 0.609943977 0.24253138
7 1999-02-26 100.25 100.25 QS 0.000000000 NA 0.39005602
8 1999-02-26 32.29 32.37 HO-0.002471424 0.184703218 0.60994398
9 1999-02-26 10.88 11.00 CO-0.010909091 0.815296782 NA
10 1999-03-31 131.50 130.75 QS 0.057361377 0.057361377 NA
11 1999-03-3144.6844.00HO0.01545 0.01545 0.18470322
12 1999-03-31 15.24 15.16 CO 0.005277045 0.005277045 0.81529678
注意到1999年2月。CO有一个NA,因为它首次出现在2月份

现在看看1999年3月,CO的值来自二月,QS的值是NA,因为二月的值是NA(由于除以0)

这能做到吗

数据:


合同<代码>合同%>%
分组依据(日期)%>%
变异(权重=权重(进位))%>%
安排(日期)%>%
分组依据(id)%>%
突变(w=dplyr::滞后(权重))%>%
解组()
##A tibble:12 x 7
#最后日期。最后价格。价格。1 id携带重量w
#                                    
#1 1998-11-30 94.5 98.5“QS”-0.0406 0.617 NA
#2 1998-11-30 31.3 32.1“HO”-0.0252 0.383 NA
#3 1998-12-3195.598“QS”—0.0255 0.757 0.617
#4 1998-12-3134.3“HO”-0.00817 0.243 0.383
#  5 1999-01-29      100          100.  “QS”-0.00498 0.390 0.757
#6 1999-01-29 33.2 33.4“HO”-0.00778 0.610 0.243
#  7 1999-02-26      100.         100“QS”0 NaN 0.390
#8 1999-02-26 32.3 32.4“HO”-0.00247 0.185 0.610
#9 1999-02-26 10.9 11“CO”-0.0109 0.815 NA
# 10 1999-03-31      132.         131“QS”0.00574 0.00574 NaN
#11 1999-03-3144.744“HO”0.0155 0.0155 0.185
#12 1999-03-31 15.2 15.2“CO”0.00528 0.00528 0.815
注:

  • 我使用了
    dplyr::lag
    而不仅仅是
    lag
    ,因为它可能与
    stats::lag
    混淆,后者的行为与
    dplyr::lag
    明显不同。虽然大多数情况下,它会工作得很好,但它会一直工作到它不工作为止。。。而且它通常不会警告您:-)

  • 无论是哪个月,这都会滞后于日期。我假设您确信
    日期总是非常频繁。如果您认为可能存在差距(按行滞后是不正确的),那么您需要将年/月划分为一个新字段,并自行加入,而不是执行
    滞后


听起来您需要dplyr的
lag
lead
功能。