加入 R 时进行总结

Summarize while joining in R

我有两个数据集,我想加入这两个数据集并同时应用汇总命令。

示例数据:

数据 1:我们在三个时间点 (obs_id) 观察了三个产品 (id) 以及对该产品的评论数量 (n_join)。

product_data = data.frame(id = c(rep("product1", 3), rep("product2", 3),rep("product3", 3)), obs_id = rep(c(1,2,3), 3), n_join = c(1,3,5,1,1,2,1,2,4))

product_data
        id obs_id n_join
1 product1      1      1
2 product1      2      3
3 product1      3      5
4 product2      1      1
5 product2      2      1
6 product2      3      2
7 product3      1      1
8 product3      2      2
9 product3      3      4

数据 2:我们观察到相同的三个产品 (id),每行反映一条评论 (review_id),对于每条评论,如果包含购买意向 (purchase_intention).

review_data = data.frame(id = c(rep("product1", 5), rep("product2", 2),rep("product3", 4)), 
                          review_id = c(1,2,3,4,5,1,2,1,2,3,4),
                          purchase_intention = c(1,1,1,0,1,0,1,0,0,1,1))
 
review_data
         id review_id purchase_intention
1  product1         1                  1
2  product1         2                  1
3  product1         3                  1
4  product1         4                  0
5  product1         5                  1
6  product2         1                  0
7  product2         2                  1
8  product3         1                  0
9  product3         2                  0
10 product3         3                  1
11 product3         4                  1

现在我想通过以下方式将评论数据加入到产品数据中: 我想在 product_data 中创建一个新列,指示包含购买意向的评论数。

示例:

因此,预期结果如下(注意数据需要按id分组):

final_data = data.frame(id = c(rep("product1", 3), rep("product2", 3),rep("product3", 3)), obs_id = rep(c(1,2,3), 3), n_join = c(1,3,5,1,1,2,1,2,4),
                         sum_purchase_intentions = c(1,3,4,0,0,1,0,0,2))
final_data
        id obs_id n_join sum_purchase_intentions
1 product1      1      1                       1
2 product1      2      3                       3
3 product1      3      5                       4
4 product2      1      1                       0
5 product2      2      1                       0
6 product2      3      2                       1
7 product3      1      1                       0
8 product3      2      2                       0
9 product3      3      4                       2

我认为结合 dplyr 包的 inner_join 和 summarize 命令应该可以做到这一点,但我没有成功地结合它们。有人可以帮忙吗?

library(dplyr); library(tidyr)
product_data %>%
  left_join(review_data, by = "id") %>%
  filter(n_join >= review_id) %>%
  count(id, obs_id, n_join, wt = purchase_intention)

#        id obs_id n_join n
#1 product1      1      1 1
#2 product1      2      3 3
#3 product1      3      5 4
#4 product2      1      1 0
#5 product2      2      1 0
#6 product2      3      2 1
#7 product3      1      1 0
#8 product3      2      2 0
#9 product3      3      4 2

这是一个“非相等连接”的示例,您希望将原始 table 中的每一行与来自第二个 table 的不同 window 数据连接起来]. dplyr 目前不提供该功能,但对于小数据,通常可以对所有可能相关的数据进行连接,然后过滤掉 window 之外的项目。

为了更直接地做到这一点,fuzzyjoinsqldfdata.table 提供了非相等连接。例如,带有 fuzzyjoin 的代码对于大型数据集会更有效,因为它只会加入与给定的 idn_join 数字相关的 review_data。当每个 id.

有很多评论时,这将减少中间数据集规模爆炸的趋势
library(fuzzyjoin)
product_data %>%
  fuzzy_left_join(review_data, 
                  by = c("id" = "id", "n_join" = "review_id"),
                  match_fun = list(`==`, `>=`)) %>%
  count(id = id.x, obs_id, n_join, wt = purchase_intention)