加入 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 中创建一个新列,指示包含购买意向的评论数。
示例:
- 要为 product_data 的第一行创建新的“sum_purchase_intention”列,我需要取第一行的值(由 n_join 在 [= review_data 中 purchase_intention 列的 41=]): 1.
- 要为 product_data 的第二行创建新的“sum_purchase_intention”列,我需要获取第一行和第二行的值(由 n_join 表示在 review_data 中 purchase_intention 列的 product_data) 中:1 + 1 + 1 = 3.
- 要为 product_data 的第三行创建新的“sum_purchase_intention”列,我需要获取第 1-5 行的值(由 n_join 在 product_data) review_data 中的 purchase_intention 列:1 + 1 + 1 + 0 + 1 = 4.
因此,预期结果如下(注意数据需要按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 之外的项目。
为了更直接地做到这一点,fuzzyjoin
、sqldf
和 data.table
提供了非相等连接。例如,带有 fuzzyjoin
的代码对于大型数据集会更有效,因为它只会加入与给定的 id
和 n_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)
我有两个数据集,我想加入这两个数据集并同时应用汇总命令。
示例数据:
数据 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 中创建一个新列,指示包含购买意向的评论数。
示例:
- 要为 product_data 的第一行创建新的“sum_purchase_intention”列,我需要取第一行的值(由 n_join 在 [= review_data 中 purchase_intention 列的 41=]): 1.
- 要为 product_data 的第二行创建新的“sum_purchase_intention”列,我需要获取第一行和第二行的值(由 n_join 表示在 review_data 中 purchase_intention 列的 product_data) 中:1 + 1 + 1 = 3.
- 要为 product_data 的第三行创建新的“sum_purchase_intention”列,我需要获取第 1-5 行的值(由 n_join 在 product_data) review_data 中的 purchase_intention 列:1 + 1 + 1 + 0 + 1 = 4.
因此,预期结果如下(注意数据需要按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 之外的项目。
为了更直接地做到这一点,fuzzyjoin
、sqldf
和 data.table
提供了非相等连接。例如,带有 fuzzyjoin
的代码对于大型数据集会更有效,因为它只会加入与给定的 id
和 n_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)