【问题标题】:Count combinations grouped by another variable计算按另一个变量分组的组合
【发布时间】:2021-12-13 13:01:37
【问题描述】:

我有以下格式的数据框

col_1 col_2
X A
X B
X C
Y B
Y C
Z A
Z C
Z D

对于 col_1 的每个元素,我想从 col_2 处构造一个包含所有大小为 2 的组合的列。例如,对于大小 2 的组合,我的结果看起来像这样

col_1 col_2
X (A, B)
X (A, C)
X (B, C)
Y (B, C)
Y (B, C)
Z (A, C)
Z (A, D)
Z (C, D)

我该怎么做?

提前致谢!

【问题讨论】:

  • 看看?combn - 它有一个FUN 参数

标签: r dplyr combinations


【解决方案1】:
library(tidyverse)

data <- tribble(
  ~col_1, ~col_2,
  "X", "A",
  "X", "B",
  "X", "C",
  "Y", "B",
  "Y", "C",
  "Z", "A",
  "Z", "C",
  "Z", "D"
)

data2 <-
  data %>%
  nest(-col_1) %>%
  mutate(
    data = data %>% map(~ {
      .x$col_2 %>%
        combn(2) %>%
        t() %>%
        as_tibble() %>%
        transmute(col_2 = map2(V1, V2, ~ c(.x, .y)))
    })
  ) %>%
  unnest(data)
#> Warning: All elements of `...` must be named.
#> Did you want `data = c(col_2)`?
#> Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
#> Using compatibility `.name_repair`.

# reduplicate rows
data %>%
  select(col_1) %>%
  left_join(data2) %>%
  as.data.frame()
#> Joining, by = "col_1"
#>    col_1 col_2
#> 1      X  A, B
#> 2      X  A, C
#> 3      X  B, C
#> 4      X  A, B
#> 5      X  A, C
#> 6      X  B, C
#> 7      X  A, B
#> 8      X  A, C
#> 9      X  B, C
#> 10     Y  B, C
#> 11     Y  B, C
#> 12     Z  A, C
#> 13     Z  A, D
#> 14     Z  C, D
#> 15     Z  A, C
#> 16     Z  A, D
#> 17     Z  C, D
#> 18     Z  A, C
#> 19     Z  A, D
#> 20     Z  C, D

reprex package (v2.0.1) 于 2021 年 12 月 13 日创建

【讨论】:

    【解决方案2】:
    library(tidyverse)
    
    df <- tribble(
      ~col_1, ~col_2,
      "X", "A",
      "X", "B",
      "X", "C",
      "Y", "B",
      "Y", "C",
      "Z", "A",
      "Z", "C",
      "Z", "D"
    )
    
    df %>%
      group_nest(col_1) %>%
      transmute(col_1, col_2 = map(data, ~ combn(
        x = .x$col_2, m = 2, FUN = toString
      ))) %>%
      unnest(col_2)
    #> # A tibble: 7 x 2
    #>   col_1 col_2
    #>   <chr> <chr>
    #> 1 X     A, B 
    #> 2 X     A, C 
    #> 3 X     B, C 
    #> 4 Y     B, C 
    #> 5 Z     A, C 
    #> 6 Z     A, D 
    #> 7 Z     C, D
    

    reprex package (v2.0.1) 于 2021 年 12 月 13 日创建

    【讨论】:

      【解决方案3】:

      也许这个data.table 选项会有所帮助

      > setDT(df)[, combn(col_2, 2, toString), col_1]
         col_1   V1
      1:     X A, B
      2:     X A, C
      3:     X B, C
      4:     Y B, C
      5:     Z A, C
      6:     Z A, D
      7:     Z C, D
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 1970-01-01
        • 2018-11-29
        • 2013-08-31
        • 2018-01-14
        • 2021-09-20
        相关资源
        最近更新 更多