【问题标题】:R tidyverse: unique identifier for union of the sets of two columns [duplicate]R tidyverse:两列集合的唯一标识符[重复]
【发布时间】:2020-08-13 23:13:07
【问题描述】:

我有一个产品数据集,其中两列代表分类。我想根据这两组的并集获得一个组 id。

组 id 必须是可传递的,如果观察 1 和 2 的 class1 相同,并且 2 和 3 的 class2 相等,则 1,2 和 3 相等。在示例中,您可以看到传递性在第 1-4 列具有相同 group_id 的结果中起作用。

任何关于如何做到这一点的提示将不胜感激 =)

# Example
df <- tribble(
  ~id, ~class1, ~class2,
  1, "A", "L1",
  2, "A", "L1",
  3, "B", "L1",
  4, "B", "L2",
  5, "C", "L3",
  6, "D", "L4")

# Desired output
result <- tribble(
  ~id, ~class1, ~class2, ~group_id,
  1, "A", "L1", 1,
  2, "A", "L1", 1,
  3, "B", "L1", 1, 
  4, "B", "L2", 1, 
  5, "C", "L3", 2,
  6, "D", "L4", 3)

【问题讨论】:

    标签: r join tidyverse


    【解决方案1】:
    df %>%
      mutate(group_id = 1 + cumsum(!(class1 == lag(class1, default = class1[1]) | 
                                     class2 == lag(class2, default = class2[1]))))
    # # A tibble: 6 x 4
    #      id class1 class2 group_id
    #   <dbl> <chr>  <chr>     <dbl>
    # 1     1 A      L1            1
    # 2     2 A      L1            1
    # 3     3 B      L1            1
    # 4     4 B      L2            1
    # 5     5 C      L3            2
    # 6     6 D      L4            3
    

    1+ 是为了让它和你的完全一样,否则前四行是0,等等。没问题,如果基于 0 或基于 1,它们仍然分组相同。)

    【讨论】:

      【解决方案2】:

      或许,我们可以使用igraph

      library(dplyr)
      library(igraph)
      df %>% 
         select(-id) %>% 
         graph_from_data_frame %>% 
         clusters %>%
         pluck(membership) -> cls
      df %>% 
           mutate(group_size = cls[class1])
      # A tibble: 6 x 4
      #     id class1 class2 group_size
      #  <dbl> <chr>  <chr>       <dbl>
      #1     1 A      L1              1
      #2     2 A      L1              1
      #3     3 B      L1              1
      #4     4 B      L2              1
      #5     5 C      L3              2
      #6     6 D      L4              3
      

      【讨论】:

        猜你喜欢
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        • 2012-07-15
        • 2013-10-01
        相关资源
        最近更新 更多