微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

在示例中:

  • “A”仍然是“A”(或变成“A & A”)
  • “A & B”仍然是“A & B”
  • “C&D&E”在三个不同的行变成“C&D”、“C&E”和“D&E”

注意(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),"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,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,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。