将具有相同单词但顺序不同的字符串分组

Group strings that have the same words but in a different order

我有一个由两个或三个不同字段创建的示例串联文本字段(请参阅下面的示例数据),但是不能保证单词的顺序相同。我想创建一个新的数据集,其中折叠具有相同单词的字段,无论顺序如何。但是,由于我事先不知道哪些词会被连接在一起,因此代码必须识别出两个字符串中的所有词都匹配。

示例数据的代码:

var1<-c("BLUE|RED","RED|BLUE","WHITE|BLACK|ORANGE","BLACK|WHITE|ORANGE")
freq<-c(1,1,1,1)
have<-as.data.frame(cbind(var1,freq))

有:

var1                 freq
BLUE|RED              1
RED|BLUE              1
WHITE|BLACK|ORANGE    1
BLACK|WHITE|ORANGE    1

如何将数据折叠成下面我想要的内容?

color               freq
BLUE|RED              2
WHITE|BLACK|ORANGE    2
data.frame(table(sapply(strsplit(have$var1, '\|'), 
             function(x)paste(sort(x), collapse = '|'))))

                Var1 Freq
1 BLACK|ORANGE|WHITE    2
2           BLUE|RED    2

在管道世界中:R > 4.0

have$var1 |>
  strsplit('\|')|>
  sapply(\(x)paste0(sort(x), collapse = "|"))|>
  table()|>
  data.frame()

这是一个tidyverse方法:

library(dplyr)
library(tidyr)

have %>% 
  group_by(id=row_number()) %>% 
  separate_rows(var1) %>% 
  arrange(var1, .by_group = TRUE) %>% 
  mutate(var1 = paste(var1, collapse = "|")) %>% 
  slice(1) %>% 
  ungroup() %>% 
  count(var1, name = "freq")
  var1                freq
  <chr>              <int>
1 BLACK|ORANGE|WHITE     2
2 BLUE|RED               2