【问题标题】:stringr for extracting patterns用于提取模式的 stringr
【发布时间】:2020-05-10 21:02:34
【问题描述】:

我正在使用 R 来解决问题

states = c("Masassachusetts, USA", "Buffalo, NY", "Flint, MI","California, USA", "Idaho, USA", "Orlando, FL"...)

我需要一个新的向量,就像

state_name = (Massachusetts, NY, MI, California, Idaho, FL..)

我尝试使用 stringr 进行模式匹配,但无法弄清楚如何打印州名或缩写

ifelse(str_detect(states," [A-Z][A-Z]")),#need to figure out what to do write to get the abbreviated state
 ifelse(str_deteCt(states,"[U][S][A]))#  code to print the full name state
,other))

【问题讨论】:

    标签: r stringr


    【解决方案1】:
    library(stringr)
    

    分隔符以“\,”代替“\”,假设字符串在逗号后有一个空格(USA 之前的前导空格)。

    state_name <- ifelse(word(states,2,sep = "\\, ")=="USA", word(states,1,sep = "\\,"), 
                     word(states,2,sep = "\\, "))
    

    当 USA 之前没有空格时,上面的代码将不可靠。在这种情况下,它将打印“USA”。下面给出的代码将工作,当有空格和没有空格的字符串混合时。

    state_name <- ifelse(word(states, -1) =="USA", word(states,1,sep = "\\,"), 
                         word(states,2,sep = "\\, "))
    

    请注意,考虑到前导空格,第三个函数的分隔符仍然是“\,”。您也可以将其设置为“\”,稍后从输出中删除空格。

    state_name <- ifelse(word(states, -1) =="USA", word(states,1,sep = "\\,"), 
                         word(states,2,sep = "\\,"))
    
    state_name <- trimws(state_name, which = "l")
    
    state_name
    #[1] "Masassachusetts" "NY"              "MI"              "California"      "Idaho"           "FL" 
    

    编辑: 要回答评论中关于有 NA 的问题,当数据集如下:

    states <- c("Masassachusetts, USA", "SUNNY Buffalo" 
               "Buffalo, NY", "Flint, MI","California, USA", 
               "Idaho, USA", "Orlando, FL", "Shanghai, China")
    

    在这种情况下,我的建议是列出各州的名称及其缩写(附在答案末尾)。

    %in% 可用于确认字符串是否为州名。

    library(dplyr)
    
    state_name <- ifelse(word(states, -1) =="USA", word(states,1,sep = "\\,"),
                         ifelse(word(states, 2, sep = "\\, ") %in% stl, 
                                word(states, 2, sep = "\\, "), NA))
    
    state_name
    #[1] "Masassachusetts" NA                "NY"              "MI"              "California"      "Idaho"          
    #[7] "FL"              NA
    

    州名及其缩写列表:

    stl <- c("Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", 
             "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", 
             "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", 
             "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", 
             "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", 
             "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", 
             "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", 
             "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", 
             "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", 
             "Wyoming", "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", 
             "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", 
             "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", 
             "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", 
             "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY")
    

    【讨论】:

    • 感谢您的帮助。只想知道代码。如果我删除 word(states,2,sep = "\\, ")=="USA" 和 word(states,2,sep = "\\, ") 中 "\\, " 之间的空格,则仅打印 USA为州名。你能解释一下为什么吗?其次,如果我希望为不符合这两个条件的条目添加“例外”或“NA”。
    • @Tania 我已经更新了我的答案。我希望它能回答你的问题。关于 NA,我在代码中包含了一个条件,结果取决于它是否满足。您能否使用具有第三个条件的字符串更新示例,以便我可以改进我的答案。
    • 我非常感谢您如何解释代码。我又学了两个虚词和修剪。我的数据在“/,”之后有空格。但感谢您解释所有场景。如果我的数据集类似于 states = c("Masassachusetts, USA", "SUNNY Buffalo" "Buffalo, NY", "Flint, MI","California, USA", "Idaho, USA", "Orlando, FL", "上海,中国”)。我希望在 SUNY Buffalo 或中国的情况下使用“NA”。
    • @Tania 检查我的编辑。这将起作用,如果州名称具有传统的缩写,如 Ala.、Calif. 等,您可以将它们添加到 stl。
    • 我也试图玩弄代码。我创建了另一个向量来定义状态条目是全名还是状态缩写或其他。州
    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-02-27
    • 2022-01-17
    • 2021-05-31
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多