我有一个使用查找表清理状态名称的函数
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
传递一个向量。
发布于 2017-07-12 10:03:11
如果我没弄错你想要什么,这里有一种方法:
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
https://stackoverflow.com/questions/45053953
复制相似问题