【问题标题】:How to replace substring values by matching reference values如何通过匹配参考值来替换子字符串值
【发布时间】:2020-10-21 14:03:04
【问题描述】:

我有话语的音标:

str <- c("aɪ nəʊ ɪts ɪts ðə sɪksθ əv ʤuːn",
       "wɛl ðə ʧæp nɛkst dɔːz ˈfaɪndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ",
       "lʌvli bu(ː)ˈkeɪ əv ˈflaʊəz fə mi wɛl ðæts ɪt",
       "ðeə raɪt ləʊ ɪn ðə liːg ɑːnt ðeɪ",
       "kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːlɪə naʊ",
       "aɪ nəʊ s ðə biː ðə bɪg bɔɪ ðeɪl",
       "jeə bət ɪt s ə məʊl aɪ kən əˈʃʊə juː",
       "ɑː ʤəst eə haʊ aɪ juːzd tə dʊ jɪəz əˈgəʊ",
       "jeə dəʊnt ˈwʌri əˈbaʊt mi æn aɪm ɔːlˈraɪt")

我想用数字替换所有双元音;双元音及其匹配的替换号码存储在参考数据框中:

ref <- data.frame(
  diphthong = c("ɪə", "eɪ", "ʊə", "ɔɪ", "aɪ", "eə", "aʊ", "əʊ"),
  replacement = 1:8
)

我可以使用 gsub 单独替换每个双元音,将结果存储在新向量中,替换该新向量中的下一个双元音,等等:

a <- gsub("ɪə", "1", str)
b <- gsub("eɪ", "2", a)
c <- gsub("ʊə", "3", b)
d <- gsub("ɔɪ", "4", c)
e <- gsub("aɪ", "5", d)
f <- gsub("eə", "6", e)
g <- gsub("aʊ", "7", f)
h <- gsub("əʊ", "8", g)

虽然这让我得到了想要的结果(见下文),但这种方法是重复的,远非优雅。如何一次性完成替换?

预期结果

[1] "5 n8 ɪts ɪts ðə sɪksθ əv ʤuːn"                    "wɛl ðə ʧæp nɛkst dɔːz ˈf5ndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ"
[3] "lʌvli bu(ː)ˈk2 əv ˈfla3z fə mi wɛl ðæts ɪt"       "ð6 r5t l8 ɪn ðə liːg ɑːnt ð2"                    
[5] "kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːl1 n7"           "5 n8 s ðə biː ðə bɪg b4 ð2l"                     
[7] "j6 bət ɪt s ə m8l 5 kən əˈʃ3 juː"                 "ɑː ʤəst 6 h7 5 juːzd tə dʊ j1z əˈg8"             
[9] "j6 d8nt ˈwʌri əˈb7t mi æn 5m ɔːlˈr5t"

【问题讨论】:

    标签: r regex match


    【解决方案1】:

    您可以从双元音数据中创建一个正则表达式来匹配每个单独的双元音,并使用单次遍历数据,将每个匹配项替换为替换列中的相应值:

    library(stringr)
    str <- c("aɪ nəʊ ɪts ɪts ðə sɪksθ əv ʤuːn",
            "wɛl ðə ʧæp nɛkst dɔːz ˈfaɪndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ",
            "lʌvli bu(ː)ˈkeɪ əv ˈflaʊəz fə mi wɛl ðæts ɪt",
            "ðeə raɪt ləʊ ɪn ðə liːg ɑːnt ðeɪ",
            "kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːlɪə naʊ",
            "aɪ nəʊ s ðə biː ðə bɪg bɔɪ ðeɪl",
            "jeə bət ɪt s ə məʊl aɪ kən əˈʃʊə juː",
            "ɑː ʤəst eə haʊ aɪ juːzd tə dʊ jɪəz əˈgəʊ",
            "jeə dəʊnt ˈwʌri əˈbaʊt mi æn aɪm ɔːlˈraɪt")
     
    ref <- data.frame(
       diphthong = c("ɪə", "eɪ", "ʊə", "ɔɪ", "aɪ", "eə", "aʊ", "əʊ"),
       replacement = 1:8
    )
    pat <- paste(ref$diphthong, collapse="|")
    str_replace_all(str, pat, function(x) ref$replacement[ref$diphthong==x])
    

    请参阅R demo。输出:

    [1] "5 n8 ɪts ɪts ðə sɪksθ əv ʤuːn"                   
    [2] "wɛl ðə ʧæp nɛkst dɔːz ˈf5ndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ"
    [3] "lʌvli bu(ː)ˈk2 əv ˈfl7əz fə mi wɛl ðæts ɪt"      
    [4] "ð6 r5t l8 ɪn ðə liːg ɑːnt ð2"                    
    [5] "kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːl1 n7"          
    [6] "5 n8 s ðə biː ðə bɪg b4 ð2l"                     
    [7] "j6 bət ɪt s ə m8l 5 kən əˈʃ3 juː"                
    [8] "ɑː ʤəst 6 h7 5 juːzd tə dʊ j1z əˈg8"             
    [9] "j6 d8nt ˈwʌri əˈb7t mi æn 5m ɔːlˈr5t"            
    

    在这种情况下,正则表达式是使用paste(ref$diphthong, collapse="|") 构建的,它只是一个基于交替的模式ɪə|eɪ|ʊə|ɔɪ|aɪ|eə|aʊ|əʊref$replacement[ref$diphthong==x] 部分将找到的双元音映射到其替换值。

    【讨论】:

      【解决方案2】:

      你可以做一个简单的for循环:

      for(i in seq_len(nrow(ref))) {
        str <- gsub(ref$diphthong[i], ref$replacement[i], str)
      }
      

      【讨论】:

        【解决方案3】:

        够了:

        stringr::str_replace_all(str, ref)
        

        其中ref 定义为:

        ref <- setNames(as.character(1:8), c("ɪə", "eɪ", "ʊə", "ɔɪ", "aɪ", "eə", "aʊ", "əʊ"))
        

        如果ref 已经定义为数据框,您可以通过这种方式转换为命名向量:

        ref <- setNames(as.character(ref$replacement), ref$diphthong)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-17
          • 2020-11-12
          • 1970-01-01
          • 2020-08-27
          • 2023-03-17
          • 1970-01-01
          相关资源
          最近更新 更多