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

Posted

技术标签:

【中文标题】对具有相同单词但顺序不同的字符串进行分组【英文标题】:Group strings that have the same words but in a different order 【发布时间】:2022-01-19 23:05:38 【问题描述】:

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

示例数据代码:

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

【问题讨论】:

【参考方案1】:
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()

【讨论】:

谢谢,后续问题 - 如果“BLUE|RED”的现有频率不止一个,我如何将“RED|BLUE”的实例添加到现有总数中?谢谢!【参考方案2】:

这是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

【讨论】:

以上是关于对具有相同单词但顺序不同的字符串进行分组的主要内容,如果未能解决你的问题,请参考以下文章

是否有代码对列中包含的相似单词进行分组

对具有相同组成的字符串进行分组

使用具有相同字符串但顺序不同的列合并两个 data.frame

VS Code:对具有相同名称和不同扩展名的文件进行分组

字母异位词分组

49.字母异位词分组