问题描述
在 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