【问题标题】:how do I find differences between similar strings?如何找到相似字符串之间的差异?
【发布时间】:2020-02-20 11:28:17
【问题描述】:

我有一个字符串向量(准确地说是文件名)。

pav <- c("Sn_4Khz_3W_45_130_02_30cm_101mm_",
         "Sn_4Khz_4W_45_130_02_30cm_101mm_",
         "Sn_4Khz_4W_50_130_02_30cm_101mm_")

我正在寻找一种简单的方法来找出这些字符串之间的差异。

`> char_position_fun(pav) # gives unique character position
[1] 9 12 13 `


`> char_diff_fun(pav) # removes matching components (position and value)
[1] 3_4_5  4_4_5  4_5_0`

【问题讨论】:

    标签: r string string-comparison


    【解决方案1】:

    这是我的尝试。我决定拆分所有字母并为每个包含位置和字母信息的字符串创建一个数据框。然后,对于每个位置,我检查是否有一个唯一的字母。如果为 FALSE,则表明并非所有字母都相同。最后,使用逻辑条件对数据框进行子集化。这样就可以同时看到位置和字母信息了。

    library(tidyverse)
    
    strsplit(mytext, split = "") %>% 
    map_dfr(.x = .,
            .f = function(x) enframe(x, name = "position", value = "word"),
            .id = "id") %>% 
    group_by(position) %>% 
    mutate(check = n_distinct(word) == 1) %>% 
    filter(check == FALSE)
    
      id    position word  check
      <chr>    <int> <chr> <lgl>
    1 1            9 3     FALSE
    2 1           12 4     FALSE
    3 1           13 5     FALSE
    4 2            9 4     FALSE
    5 2           12 4     FALSE
    6 2           13 5     FALSE
    7 3            9 4     FALSE
    8 3           12 5     FALSE
    9 3           13 0     FALSE
    

    如果你想得到你描述的结果,你可以多加一点操作。

    strsplit(mytext, split = "") %>% 
    map_dfr(.x = .,
            .f = function(x) enframe(x, name = "position", value = "word"),
            .id = "id") %>% 
    group_by(position) %>% 
    mutate(check = n_distinct(word) == 1) %>% 
    filter(check == FALSE) %>% 
    group_by(id) %>% 
    summarize_at(vars(position:word),
                 .funs = list(~paste0(., collapse = "_")))
    
      id    position word 
      <chr> <chr>    <chr>
    1 1     9_12_13  3_4_5
    2 2     9_12_13  4_4_5
    3 3     9_12_13  4_5_0
    

    数据

    mytext <- c("Sn_4Khz_3W_45_130_02_30cm_101mm_", "Sn_4Khz_4W_45_130_02_30cm_101mm_", 
    "Sn_4Khz_4W_50_130_02_30cm_101mm_")
    

    【讨论】:

      【解决方案2】:

      这是一个基本的 R 解决方案。

      首先,我们可以将字符串从 UTF8 反转为 Int,即,

      z <- Map(utf8ToInt,v)
      
      • 不同的立场
      pos <- unique(unlist(outer(z,z,FUN = Vectorize(function(x,y) which(x!=y)))))
      
      > pos
      [1]  9 12 13
      
      • 不同的字符:
      word <- Map(function(x) paste(intToUtf8(x[p],multiple = T),collapse = "_"),z)
      
      > word
      $Sn_4Khz_3W_45_130_02_30cm_101mm_
      [1] "3_4_5"
      
      $Sn_4Khz_4W_45_130_02_30cm_101mm_
      [1] "4_4_5"
      
      $Sn_4Khz_4W_50_130_02_30cm_101mm_
      [1] "4_5_0"
      

      数据

      v <- c("Sn_4Khz_3W_45_130_02_30cm_101mm_", "Sn_4Khz_4W_45_130_02_30cm_101mm_", 
                  "Sn_4Khz_4W_50_130_02_30cm_101mm_")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-06
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多