【问题标题】: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

【问题讨论】:

    标签: r string grouping


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多