您好,我有一个包含三个主要列的数据框:company、product_type 和 product_ID。前两列是不言自明的,第三列的 ID 是全局的并且对于每个项目都是唯一的。
input_example <- data.frame(company = c(rep("companyA", 4), rep("companyB", 6)), product_type = c(rep("shirts", 3), "pants", rep("shirts",4), rep("pants", 2)), product_ID = seq(1,10))
> input_example
company product_type product_ID
1 companyA shirts 1
2 companyA shirts 2
3 companyA shirts 3
4 companyA pants 4
5 companyB shirts 5
6 companyB shirts 6
7 companyB shirts 7
8 companyB shirts 8
9 companyB pants 9
10 companyB pants 10
我想要的是each 公司内所有衬衫和裤子的唯一组合,并具有与之关联的唯一产品ID。例如所需的输出:
>output
company product_type.x product_ID.x product_type.y product_ID.y
1 companyA shirts 1 pants 4
2 companyA shirts 2 pants 4
3 companyA shirts 3 pants 4
4 companyB shirts 5 pants 9
5 companyB shirts 5 pants 10
6 companyB shirts 6 pants 9
7 companyB shirts 6 pants 10
8 companyB shirts 7 pants 9
9 companyB shirts 7 pants 10
10 companyB shirts 8 pants 9
11 companyB shirts 8 pants 10
我通过组合 split 和 inner_join 实现了这个:
output <- split(input_case, input_case$company) %>% lapply(., function(x){
x %>% inner_join(x, by=c("company")) %>% filter(product_type.x != product_type.y)
}) %>% do.call(rbind,.) %>% filter(product_ID.x < product_ID.y) %>% remove_rownames()
虽然我的代码可以处理这个简单的例子,但我的真实案例数据总共有大约1亿行产品。我想知道是否有任何方法可以加速这一过程。我在考虑并行
lapply
功能,但它仍然很慢。
感谢您的任何建议。