【问题标题】:count number of combinations by group按组计算组合数
【发布时间】:2022-02-18 20:58:26
【问题描述】:

我正在努力计算数据中唯一组合的数量。我想先按id 对它们进行分组,然后计算每个值组合出现的次数。在这里,无论元素组合在'd-f还是f-d中,它们仍然属于同一类别,因为它们具有相同的元素:

combinations: 

       n
c-f:   2   # aslo f-c
c-d-f: 1   # also cfd or fdc
d-f:   2   # also f-d or d-f. The dash is only for isualization purposes  

虚拟示例:

# my data
dd <- data.frame(id = c(1,1,2,2,2,3,3,4, 4, 5,5),
             cat = c('c','f','c','d','f','c','f', 'd', 'f', 'f', 'd'))



> dd
  id cat
1  1   c
2  1   f
3  2   c
4  2   d
5  2   f
6  3   c
7  3   f
8  4   d
9  4   f
10  5   f
11  5   d

使用paste 是@benson23 提供的一个很好的解决方案,但它认为f-dd-f 是唯一的类别。但是,我希望顺序无关紧要。谢谢!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    summarise中创建一个“组合”列,我们以后可以统计这个列。

    一种简单的计算类别的方法是从一开始就对它们进行排序,然后在这种情况下它们都将按相同的顺序排列。

    library(dplyr)
    
    dd %>% 
      group_by(id) %>% 
      arrange(id, cat) %>% 
      summarize(combination = paste0(cat, collapse = "-"), .groups = "drop") %>% 
      count(combination)
    
    # A tibble: 3 x 2
      combination     n
      <chr>       <int>
    1 c-d-f           1
    2 c-f             2
    3 d-f             2
    

    【讨论】:

    • 感谢您的精彩分析!我想知道,如何将d-ffd 视为同一类别?它们包含相同的元素,但它们的顺序实际上并不重要。也许一个简单的解决方法就是简单地订购它们?然后保持订单填充,我将得到相同的类别。谢谢!
    • 是的,我同意最简单的方法是先订购元素。我已将其包含在我的答案中。
    • 我认为在解决方案的某些方面,在计算组合时需要某种形式的排序,并且在 summarise 步骤之后这样做会变得非常难看。因此,我建议在一开始就添加一个arrange 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多