【问题标题】:Rolling join with group ID in both tables在两个表中使用组 ID 滚动连接
【发布时间】:2020-04-28 03:49:12
【问题描述】:

我们有两个数据框,第一个包含一组产品的播放广告日期,第二个包含同一组产品的销售日期。
我们希望在广告之后为每个产品的每个广告附加最近的销售。

这是输入的代码:

original_table = data.table(article = c('A','A','A','B','B','B','B'), 
                            date_ad = as.Date(c('2010-04-09','2011-07-12','2012-05-22','2011-07-12','2014-02-02','2015-04-13','2016-08-12'),))

> original_table
   article    date_ad
1:       A 2010-04-09
2:       A 2011-07-12
3:       A 2012-05-22
4:       B 2011-07-12
5:       B 2014-02-02
6:       B 2015-04-13
7:       B 2016-08-12

table_to_join = data.table(article = c('A','A','B','B','B'), 
                           date_sale = as.Date(c('2010-12-15','2012-08-20','2013-12-01','2016-01-05','2017-01-20'),))

> table_to_join
   article  date_sale
1:       A 2010-12-15
2:       A 2012-08-20
3:       B 2013-12-01
4:       B 2016-01-05
5:       B 2017-01-20

将第二个表中的日期附加到第一个表中的日期后,输出应具有以下格式:

> result
   article    date_ad  date_sale
1:       A 2010-04-09 2010-12-15
2:       A 2011-07-12 2012-08-20
3:       A 2012-05-22 2012-08-20
4:       B 2011-07-12 2013-12-01
5:       B 2014-02-02 2016-01-05
6:       B 2015-04-13 2016-01-05
7:       B 2016-08-12 2017-01-20

P.S : 对于每篇文章,original_table 的行数可能比table_to_join 多得多。 original_table 中的多行可以链接到 table_to_join 的同一行。

我们怎样才能有效地做到这一点?

【问题讨论】:

    标签: r datetime data.table


    【解决方案1】:

    我们可以对data.table使用滚动连接

    library(data.table)
    table_to_join[, date_ad := date_sale][original_table, 
           on = .(article, date_sale = date_ad), roll = -Inf]
    #   article  date_sale    date_ad
    #1:       A 2010-04-09 2010-12-15
    #2:       A 2011-07-12 2012-08-20
    #3:       B 2015-04-13 2016-01-05
    #4:       B 2016-08-12 2017-01-20
    

    我认为 OP 与输出列的命名混淆了。通过引用使用更新应该更清楚:

    table_to_join[, date_ad := date_sale]
    original_table[, date_sale :=
        table_to_join[.SD, on=.(article, date_ad), roll=-Inf, x.date_sale]
    ]
    

    输出:

       article  date_sale    date_ad
    1:       A 2010-04-09 2010-12-15
    2:       A 2011-07-12 2012-08-20
    3:       A 2012-05-22 2012-08-20
    4:       B 2011-07-12 2013-12-01
    5:       B 2014-02-02 2016-01-05
    6:       B 2015-04-13 2016-01-05
    7:       B 2016-08-12 2017-01-20
    

    【讨论】:

    • 感谢您的回答,这就是我得到的:[.data.table(table_to_join, , :=(date_sale, date_ad)) 中的错误:提供了 36138255 个项目以分配给列的 169538 个项目'日期销售'。如果您希望“回收”RHS,请使用 rep() 向您的代码读者明确这一意图。
    • @mix 这是基于你的例子,对不起,
    • 好的,我在帖子末尾添加了一条注释,以明确第一张桌子可能有更多样品,其中许多样品可能与同一销售日期相关。
    • @mix 这不是样本量,而是连接列的重复值
    • @mlx 如果你让它独一无二,也许它可以工作,即table_to_join[, date_ad := date_sale][unique(original_table, by = 'date_ad), on = .(article, date_sale = date_ad), roll = -Inf]
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多