【问题标题】:Gsub command to replace all spaces with a comma and space, (", "), except after certain words with RGsub 命令用逗号和空格 (", ") 替换所有空格,除了某些单词之后用 R
【发布时间】:2021-08-22 23:24:48
【问题描述】:

我有一个 data.frame,其中包含一个包含加利福尼亚县的列,每个单元格中用空格分隔。我想在每个之后添加一个逗号和空格,但是我不能像某些县一样将每个空格都添加到逗号和空格中(即 gsub("\s",",\s",text))在加利福尼亚有两个名字,(例如洛杉矶、旧金山等)

幸运的是,这两个单词的县都有共同的第一个单词,所以我想编写一个 gsub 来保留这些县中的空间而不添加逗号。我附上了示例数据以及我希望最终表单的样子。例如,对于这些数据,我想在“El”、“San”和“Del”之后添加逗号和空格。

示例数据:

c("Lassen Modoc Nevada Plumas Shasta Sierra Siskiyou Butte Placer", 
"Del Norte Humboldt Trinity Mendocino Sonoma", "Glenn Sutter Tehama Yuba Butte Colusa", 
"Lake Napa Yolo Colusa Sonoma Solano", "Madera Amador Tuolumne Calaveras Mariposa Mono Alpine El Dorado Placer", 
"El Dorado Placer Sacramento", "Sacramento Yolo", "Sacramento", 
"Sacramento San Joaquin", "Marin Sonoma")

期望的输出:

c("Lassen, Modoc, Nevada, Plumas, Shasta, Sierra, Siskiyou, Butte, Placer", 
  "Del Norte, Humboldt, Trinity, Mendocino, Sonoma", "Glenn, Sutter, Tehama, Yuba, Butte, Colusa", 
  "Lake, Napa, Yolo, Colusa, Sonoma, Solano", "Madera, Amador, Tuolumne, Calaveras, Mariposa, Mono, Alpine, El Dorado, Placer", 
  "El Dorado, Placer, Sacramento", "Sacramento, Yolo", "Sacramento", 
  "Sacramento, San Joaquin", "Marin, Sonoma")

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    鉴于您知道您只是在寻找加利福尼亚县,一种“简单”的方法是仅替换加利福尼亚县之后出现的空格。为了得到那个正则表达式,我只是将 CA 县名与| 连接在一起并添加了一个空格。 gsub 将替换任何县名,后跟具有相同县名的空格 (\\1)、逗号和空格。

    ca_regex <- "(Los Angeles|San Diego|Orange|Riverside|San Bernardino|Santa Clara|Alameda|Sacramento|Contra Costa|Fresno|Kern|San Francisco|Ventura|San Mateo|San Joaquin|Stanislaus|Sonoma|Tulare|Santa Barbara|Solano|Monterey|Placer|San Luis Obispo|Santa Cruz|Merced|Marin|Butte|Yolo|El Dorado|Imperial|Shasta|Madera|Kings|Napa|Humboldt|Nevada|Sutter|Mendocino|Yuba|Lake|Tehama|San Benito|Tuolumne|Calaveras|Siskiyou|Amador|Lassen|Glenn|Del Norte|Colusa|Plumas|Inyo|Mariposa|Mono|Trinity|Modoc|Sierra|Alpine) "
    
    input <- c(
      "Lassen Modoc Nevada Plumas Shasta Sierra Siskiyou Butte Placer",
      "Del Norte Humboldt Trinity Mendocino Sonoma", "Glenn Sutter Tehama Yuba Butte Colusa",
      "Lake Napa Yolo Colusa Sonoma Solano", "Madera Amador Tuolumne Calaveras Mariposa Mono Alpine El Dorado Placer",
      "El Dorado Placer Sacramento", "Sacramento Yolo", "Sacramento",
      "Sacramento San Joaquin", "Marin Sonoma"
    )
    
    gsub(ca_regex, "\\1, ", input)
    #>  [1] "Lassen, Modoc, Nevada, Plumas, Shasta, Sierra, Siskiyou, Butte, Placer"        
    #>  [2] "Del Norte, Humboldt, Trinity, Mendocino, Sonoma"                               
    #>  [3] "Glenn, Sutter, Tehama, Yuba, Butte, Colusa"                                    
    #>  [4] "Lake, Napa, Yolo, Colusa, Sonoma, Solano"                                      
    #>  [5] "Madera, Amador, Tuolumne, Calaveras, Mariposa, Mono, Alpine, El Dorado, Placer"
    #>  [6] "El Dorado, Placer, Sacramento"                                                 
    #>  [7] "Sacramento, Yolo"                                                              
    #>  [8] "Sacramento"                                                                    
    #>  [9] "Sacramento, San Joaquin"                                                       
    #> [10] "Marin, Sonoma"
    

    如果您愿意,您可以使用否定的lookbehind ((?&lt;!)) 来使用更短的模式。这一个仅采用 CA 县列表中的前缀词,并且只会替换不在其中之一之后的空格。不过,我认为这有点难以推理,也更难想出(例如,在第一次发布时,我忘记了两个间距的圣路易斯奥比斯波县)

    gsub("(?<!Los|San|Santa|Contra|El|Del|Luis) ", ", ", input, perl = TRUE)
    #>  [1] "Lassen, Modoc, Nevada, Plumas, Shasta, Sierra, Siskiyou, Butte, Placer"        
    #>  [2] "Del Norte, Humboldt, Trinity, Mendocino, Sonoma"                               
    #>  [3] "Glenn, Sutter, Tehama, Yuba, Butte, Colusa"                                    
    #>  [4] "Lake, Napa, Yolo, Colusa, Sonoma, Solano"                                      
    #>  [5] "Madera, Amador, Tuolumne, Calaveras, Mariposa, Mono, Alpine, El Dorado, Placer"
    #>  [6] "El Dorado, Placer, Sacramento"                                                 
    #>  [7] "Sacramento, Yolo"                                                              
    #>  [8] "Sacramento"                                                                    
    #>  [9] "Sacramento, San Joaquin"                                                       
    #> [10] "Marin, Sonoma"
    

    【讨论】:

    • 如果您使用第二个选项,请注意我只是将其更改为处理圣路易斯奥比斯波。
    【解决方案2】:
    gsub('(\\w{4,}) ', '\\1, ', vec)
    
     [1] "Lassen, Modoc, Nevada, Plumas, Shasta, Sierra, Siskiyou, Butte, Placer"        
     [2] "Del Norte, Humboldt, Trinity, Mendocino, Sonoma"                               
     [3] "Glenn, Sutter, Tehama, Yuba, Butte, Colusa"                                    
     [4] "Lake, Napa, Yolo, Colusa, Sonoma, Solano"                                      
     [5] "Madera, Amador, Tuolumne, Calaveras, Mariposa, Mono, Alpine, El Dorado, Placer"
     [6] "El Dorado, Placer, Sacramento"                                                 
     [7] "Sacramento, Yolo"                                                              
     [8] "Sacramento"                                                                    
     [9] "Sacramento, San Joaquin"                                                       
    [10] "Marin, Sonoma"           
    

    【讨论】:

    • 这对于 OP 的输入集来说很好,但会拆分 Santa Clara 和 Contra Costa,因为它们的第一个单词有超过 4 个字母。
    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2015-01-13
    相关资源
    最近更新 更多