在另一个 group_by 变量中扩展的整洁方式

问题描述 投票:0回答:0

您好,我有一个包含三个主要列的数据框: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
功能,但它仍然很慢。

感谢您的任何建议。

r split combinations tidyr expand
© www.soinside.com 2019 - 2024. All rights reserved.