如何使用多个if语句向量化一个函数?

时间:2017-07-12 09:36:39

标签: r function vectorization

我有一个使用查找表清理状态名称的函数

library(stringr)
library(dplyr)
lkt <- data_frame(state=state.abb, state_name=state.name)
cleanState <- function(x, lkt) {
  x <- stringr::str_trim(x)
  if(any(str_detect(x, fixed(lkt$state_name, ignore_case = T)))) {
    grep(x, lkt$state_name, useBytes = T, value=T, ignore.case = T)

    } else if (any(str_detect(x, fixed(lkt$state, ignore_case = T)))) {
      grep(x, lkt$state, useBytes = T, value=T, ignore.case = T)
    } else {
      NA
    }
}

但是我想对它进行矢量化以在状态名称或缩写(例如x <- c('MN', 'Texas', 'Neww York'))上运行它,它应该检索向量('Minnesota', 'Texas', NA)

我尝试使用嵌套的ifelse,但我仍然无法让它工作,我知道我可以使用sapply但我宁愿向量化这个函数,这样我就可以通过向x传播。

1 个答案:

答案 0 :(得分:2)

如果我正确理解你想要的东西,这是一种方法:

lkt <- data.frame(state=state.abb, state_name=state.name,stringsAsFactors = FALSE)
cleanState2 <- function(x) {
  get.ind <- function(s) {
    out <- grep(s, paste(lkt$state_name, lkt$state, sep = "|"), ignore.case = TRUE)
    ifelse(identical(out, integer(0)), NA, out)
  }
  ind <- unlist(sapply(x, get.ind))
  lkt$state_name[ind]
}

x <- c('MN', 'Texas', 'Neww York')
cleanState2(x)
#[1] "Minnesota" "Texas"     NA