报告字符串分隔向量的所有可能组合
Report all possible combinations of a string-separated vector
在 tidyverse 中,我想 mutate/expand 一个字符串向量,以便报告所有可能的元素组合(由“&”分隔),每行一个。
我尝试使用 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,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
在 tidyverse 中,我想 mutate/expand 一个字符串向量,以便报告所有可能的元素组合(由“&”分隔),每行一个。
我尝试使用 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,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