【问题标题】:State name to abbreviation州名到缩写
【发布时间】:2011-03-23 21:41:38
【问题描述】:

我有一个带有变量state 的大文件,该变量具有完整的状态名称。我想将其替换为州缩写(即“纽约”的“NY”)。有没有一种简单的方法可以做到这一点(除了使用几个 if-else 命令)?可能是使用replace() 声明?

【问题讨论】:

    标签: r


    【解决方案1】:

    R 有两个可能有帮助的内置常量:state.abb 带有缩写,state.name 带有全名。下面是一个简单的用法示例:

    > x <- c("New York", "Virginia")
    > state.abb[match(x,state.name)]
    [1] "NY" "VA"
    

    【讨论】:

    • 非常感谢。这只是节省了我 30 分钟在 R 中编写 50 个 if-else 语句的时间。
    • @user227290 : 如果你在考虑 ifelse,看看?switch 可能是明智之举,永远不知道将来什么时候会派上用场。
    • 假设华盛顿特区的格式为“哥伦比亚特区”,我认为 c(state.abb, 'DC')[match(x, c(state.name, 'District of Columbia'))] 也可以
    【解决方案2】:

    1) grep 来自state.name 的全名,并使用它来索引state.abb

    state.abb[grep("New York", state.name)]
    ## [1] "NY"
    

    1a) 或使用which

    state.abb[which(state.name == "New York")]
    ## [1] "NY"
    

    2) 或创建名称为全名的州缩写向量并使用全名对其进行索引:

    setNames(state.abb, state.name)["New York"]
    ## New York 
    ##     "NY" 
    

    与 (1) 不同,即使“纽约”被一个完整的州名向量替换,这个也可以工作,例如setNames(state.abb, state.name)[c("New York", "Idaho")]

    【讨论】:

    • 当 grep 的第一个参数是字符串向量时,这会起作用吗?
    • 不,在这种情况下使用 match 代替 Aniko 建议的 grep 或尝试 setNames(state.abb, state.name)[c("New York", "Idaho")]
    • 谢谢,它澄清了问题。
    • 如果有,比如说,state.name 的一部分,比如“illinois”的“ill”?当模式是实际state.name 的子字符串时,是否有解决方案?
    【解决方案3】:

    我发现内置的 state.name 和 state.abb 只有 50 个状态。我从网上(例如,此链接:http://www.infoplease.com/ipa/A0110468.html)获得了一个更大的表(包括 DC 等)并将其粘贴到名为 States.csv 的 .csv 文件中。然后我加载状态和缩写。从这个文件,而不是使用内置。其余的和@Aniko 的很相似

    library(dplyr)
    library(stringr)
    library(stringdist)
    
    setwd()
    # load data
    data = c("NY", "New York", "NewYork")
    data = toupper(data)
    
    # load state name and abbr.
    State.data = read.csv('States.csv')
    State = toupper(State.data$State)
    Stateabb = as.vector(State.data$Abb)
    
    # match data with state names, misspell of 1 letter is allowed
    match = amatch(data, State, maxDist=1)
    data[ !is.na(match) ] = Stateabb[ na.omit( match ) ]
    

    match 和 amatch 在计算一个词到另一个词的距离方面存在细微差别。请参阅此处的 P25-26 http://cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf

    【讨论】:

      【解决方案4】:

      我知道的旧帖子,但想把我的扔在那里。我在 tidyverse 上学习过,所以无论好坏,我都会尽可能避免使用 base R。我也想要一个带 DC 的,所以首先我建造了人行横道:

      library(tidyverse)
      
       st_crosswalk <- tibble(state = state.name) %>%
         bind_cols(tibble(abb = state.abb)) %>% 
         bind_rows(tibble(state = "District of Columbia", abb = "DC"))
      

      然后我将它加入到我的数据中:

      left_join(data, st_crosswalk, by = "state")
      

      【讨论】:

        【解决方案5】:

        如果您没有美国州名,也可以使用 base::abbreviate。除非您增加 minlength,否则这不会给您同样大小的缩写。

        state.name %>% base::abbreviate(minlength = 1)
        

        【讨论】:

          【解决方案6】:

          如果您必须经常将州名称与缩写匹配或其他方式匹配,您可以将 Aniko 的解决方案放在 .Rprofile 或包中的函数中:

          state_to_st <- function(x){
            c(state.abb, 'DC')[match(x, c(state.name, 'District of Columbia'))]
          }
          
          
          st_to_state <- function(x){
            c(state.name, 'District of Columbia')[match(x, c(state.abb, 'DC'))]
          }
          

          将该函数用作 dplyr 链的一部分:

          enframe(state.name, value = 'state_name') %>% 
            mutate(state_abbr = state_to_st(state_name))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多