对具有相同单词但顺序不同的字符串进行分组
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
【讨论】:
以上是关于对具有相同单词但顺序不同的字符串进行分组的主要内容,如果未能解决你的问题,请参考以下文章