【问题标题】:Find all possible combinations subject to group and person根据组和人查找所有可能的组合
【发布时间】:2020-08-25 16:21:11
【问题描述】:

实际上,我的数据集要长得多,但这里有一个较小的示例来展示我想要实现的目标。
在“Set1”中,我有 Amy、Meg 和 Ryan。在'Set2'中,我只有Amy。在“Set3”中,我有 Jim 和 Ryan。

对于每个集合,我想要一个数据框,其中列出可以围绕特定人创建的所有可能的组 - 一个人可以在一个只有他们自己的组中。例如。对于 Set1,可以创建四个不同的组,其中包括 Amy:

第 1 组:艾米、梅格、瑞恩

第 2 组:艾米

第 3 组:艾米、梅格

第 4 组:艾米、瑞恩

可重复的数据

structure(list(Set = c(1, 1, 1, 2, 3, 3), Person = c("Amy", "Meg", 
"Ryan", "Amy", "Jim", "Ryan")), class = "data.frame", row.names = c(NA, 
-6L), spec = structure(list(cols = list(Set = structure(list(), class = 
c("collector_double", 
"collector")), Person = structure(list(), class = c("collector_character", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"))

【问题讨论】:

    标签: r dataframe combinations


    【解决方案1】:

    这是一个使用一些 tidyverse 东西的函数。

    make_groups <- function(df) {
      require(tidyverse)
      n <- df %>% 
        group_by(Set) %>%
        summarize(n()) %>%
        select(-Set) %>%
        max()
       
      df2 <- df
      for(i in 1:(n-1)) {
        df2 <- inner_join(df2, df, by = "Set")
      }
      df2 %>% 
        rownames_to_column(var = "id") %>%
        nest_by(id, Set) %>%
        mutate(Group = list(str_c(unique(unlist(data)), collapse = ", "))) %>%
        ungroup() %>%
        select(Set, Group) %>%
        distinct() %>%
        unnest(Group) %>%
        arrange(Set, Group)
    }
    

    所以你可以运行make_groups(data) 并得到以下输出:

    # A tibble: 20 x 2
         Set Group         
       <dbl> <chr>         
     1     1 Amy           
     2     1 Amy, Meg      
     3     1 Amy, Meg, Ryan
     4     1 Amy, Ryan     
     5     1 Amy, Ryan, Meg
     6     1 Meg           
     7     1 Meg, Amy      
     8     1 Meg, Amy, Ryan
     9     1 Meg, Ryan     
    10     1 Meg, Ryan, Amy
    11     1 Ryan          
    12     1 Ryan, Amy     
    13     1 Ryan, Amy, Meg
    14     1 Ryan, Meg     
    15     1 Ryan, Meg, Amy
    16     2 Amy           
    17     3 Jim           
    18     3 Jim, Ryan     
    19     3 Ryan          
    20     3 Ryan, Jim  
    

    【讨论】:

    • 我得到以下信息:警告消息: distinct() 不完全支持 list 类型的列。列表元素通过引用进行比较,详见 ?distinct 。这会影响以下列: - Group
    • 我没有收到这条消息。当它到达distinct() 时,应该没有列表列。我在R v 4.0.2 中使用dplyr v 1.0.1。如果您使用的是旧版本的dplyr,也许这就是问题所在。如果是这样,请将unnest(Group) 移动到distinct() 之前
    • 我使用的是 R v 4.0.2,tidyverse v 1.3.0,我已经更新了我的 dplyr,所以我使用的是 1.0.2 版本。当我使用可重现的数据运行代码时,它并没有给我与您相同的输出。它说 - summarise() 取消分组输出(用 .groups 参数覆盖)。这是为什么呢?
    • 在较新版本的dplyr 中,summarise 动词对于组有一些新的行为。默认情况下,它会删除最后一级分组。在这种情况下,它在汇总后取消分组数据,因为只有一组。这应该不会给整个函数带来麻烦,因为汇总之后的步骤不需要分组数据。
    • 这是我的包版本:tidyverse 1.3.0、tidyr 1.1.1、dplyr 1.0.1、stringr 1.4.0。您是否有可能加载了另一个包来掩盖其中一个包中的功能?如果你开始一个新的 R 会话并且只加载 tidyverse 会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多