报告字符串分隔向量的所有可能组合

Report all possible combinations of a string-separated vector

在 tidyverse 中,我想 mutate/expand 一个字符串向量,以便报告所有可能的元素组合(由“&”分隔),每行一个。

我尝试使用 t(combn(unlist(strsplit(x, " & ")),2)) 分解我的函数,但是当没有“&”时失败了。

示例中:

注(1):我无法提前预知组合的个数“A & B & C & D...”

注(2):顺序不重要(即“C&D”==“D&C”)

注意 (3):这将提供给 separate 函数并在 igraph 应用程序中使用。

提前致谢。

data <- data.frame(names=c(1:3), combinations=c("A","A & B","C & D & E"))

  names combinations
1     1            A
2     2        A & B
3     3    C & D & E

expected <- data.frame(projects=c(1,2,3,3,3), combinations=c("A","A & B","C & D","C & E","D & E"))

  projects combinations
1        1            A
2        2        A & B
3        3        C & D
4        3        C & E
5        3        D & E

您可以使用 combn 在每个 name 中创建组合:

library(dplyr)
library(tidyr)

data %>%
  separate_rows(combinations, sep = ' & ') %>%
  group_by(names) %>%
  summarise(combinations = if(n() > 1) 
          combn(combinations, 2, paste0, collapse = ' & ') else combinations) %>%
  ungroup

#  names combinations
#  <int> <chr>       
#1     1 A           
#2     2 A & B       
#3     3 C & D       
#4     3 C & E       
#5     3 D & E       

一个data.table选项

setnames(
  setDT(data)[
    ,
    {
      s <- unlist(strsplit(combinations, " & "))
      if (length(s) == 1) s else combn(s, 2, paste0, collapse = " & ")
    },
    names
  ], "V1", "combinations"
)[]

给予

   names combinations
1:     1            A
2:     2        A & B
3:     3        C & D
4:     3        C & E
5:     3        D & E

使用data.table方法

library(splitstackshape)
setnames(cSplit(data, 'combinations', sep=' & ', 'long', type.convert = FALSE)[,  
     if(.N > 1) combn(combinations, 2, FUN = paste, collapse = ' & ') else
         combinations, names], 'V1', 'combinations')[]
#   names combinations
#1:     1            A
#2:     2        A & B
#3:     3        C & D
#4:     3        C & E
#5:     3        D & E