使用第一行(按组)求和日​​期差-R数据表查找

时间:2019-08-27 12:08:02

标签: r data.table

这是上一个问题的延续:Average the first row by group from data.table lookup

我希望能够在以下数据集中生成个人的时间加权平均值和每个公司的时间加权平均值:

table1 <- fread(
  "individual_id | date       
       1             |  2018-01-02
       1             |  2018-01-04
       1             |  2018-01-05
       2             |  2018-01-02
       2             |  2018-01-05", 
  sep ="|"
)
table1$date = as.IDate(table1$date)
table2 <- fread(
  "individual_id | date2       | company_id | alpha
       1             |  2018-01-02 |     62       |  1     
       1             |  2018-01-04 |     62       |  1.5 
       1             |  2018-01-05 |     63       |  1   
       2             |  2018-01-01 |     71       |  2     
       2             |  2018-01-02 |     74       |  1   
       2             |  2018-01-05 |     74       |  4",
  sep = "|"
)
table2$date2 = as.IDate(table2$date2)

生成这些alpha值的第一步是按组计算平均值(我可以使用上一个问题的答案来进行计算),第二步是获取时间权重

为此,我需要能够总结日期(在表1中)和创建观察值的日期(表2中的 date2 )之间的天数差)。对于每个人/公司的最新观察结果,我也只需这样做。

目前,我认为应该可以进行以下操作:

table1[, time_weight := 
         #perform non-equi join
         table2[table1, on=.(individual_id, date2<=date), 
                #for each row of table1,
                by=.EACHI,
                #get most recent date difference by company_id and sum the values
                sum(.SD[, last((i.date-date2)), by=.(company_id)]$V1)]$V1
       ]

但这会产生以下结果:

individual_id  |    date    |  mean_alpha   |  time_weight
1        |  02/01/2018  |   1        |  0
1        |  04/01/2018  |   1.5      |  2
1        |  05/01/2018  |   1.25     |  6
2        |  02/01/2018  |   1.5      |  2
2        |  05/01/2018  |   3        |  8

其中部分不正确,例如:

表1:

观测值1-personal_id 1和日期2018-01-02是正确,因为日期差为0。 观察值2-个体ID 1和日期2018-01-04 不正确,因为公司62的最新观察值也是2018-01-04,因此date-date2为0,而不是提供的2。 / p>

预期输出:

individual_id  |    date    |  mean_alpha   |  time_weight
1        |  02/01/2018  |   1        |  0
1        |  04/01/2018  |   1.5      |  0
1        |  05/01/2018  |   1.25     |  1
2        |  02/01/2018  |   1.5      |  1
2        |  05/01/2018  |   3        |  4

非常感谢您的帮助

最终目标

最终目标是按如下所示对alpha进行指数加权:

table1[, time_weight := 
         #perform non-equi join
         table2[table1, on=.(individual_id, date2<=date), 
                #for each row of table1,
                by=.EACHI,
                #get most recent alpha by company_id and average the alphas
                sum(.SD[, last(alpha*exp(i.date-date2)), by=.(company_id)]$V1)/
                  sum(.SD[, last(exp(i.date-date2)), by=.(company_id)]$V1)]$V1
           ]

更新

数据表联接的行为很奇怪:

table2[table1, on=.(individual_id, date2<=date), 
       #for each row of table1,
       by=.EACHI,
       #get max alpha by company_id
       ( .SD[,max(alpha), by=.(company_id)]$V1)]$V1

提供预期的以下输出:

[1] 1.0 1.5 1.5 1.0 2.0 1.0 2.0 4.0

但是,当我使用日期进行此操作时,我不会得到相同的行为:

table2[table1, on=.(individual_id, date2<=date), 
       #for each row of table1,
       by=.EACHI,
       #get most max date by company_id
       ( .SD[,max(date2), by=.(company_id)]$V1)]$V1

返回的日期是:

[1] "2018-01-02" "2018-01-02" "2018-01-02" "2018-01-02"
[5] "2018-01-01" "2018-01-01" "2018-01-01" "2018-01-01"

这很奇怪,因为为第2项返回的最大日期应为“ 2018-01-04”,因为当返回该日期的alpha值时,该日期明显存在。但是,不会返回。

1 个答案:

答案 0 :(得分:0)

好吧,事实证明您不能基于连接条件之一进行选择,因此我必须创建一个新列date_second_copy,然后基于此选择,例如:

table2$date2_copy = table2$date2

table1[, time_weight := 
         #perform non-equi join
         table2[table1, on=.(individual_id, date2<=date), 
                #for each row of table1,
                by=.EACHI,
                #get most recent date difference by company_id and sum the values
                sum(.SD[, last((i.date-date2_copy)), by=.(company_id)]$V1)]$V1
       ]