我有一个使用查找表清理状态名称的函数
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
传播。
答案 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