我想根据字符串的前两个字符使用switch语句进行分支。在下面显示的示例中,我想返回" Apple"与#34; aabb"或" aacc"
test<-c("aabb", "aacc", "bbbb")
foo <- Vectorize(function(a) {
switch(as.character(a),
"^aa" = "Apple",
"bbbb" = "Grape",
"Unknown")
}, "a")
> foo(test)
aabb aacc bbbb
"Unknown" "Unknown" "Grape"
如果存在完全匹配,我可以使该语句起作用,但我无法弄清楚如何仅使用前两个字符来获得匹配。也许有一种使用Regex的方法?如图所示,我尝试使用^
来匹配字符串的开头(与grep
一起使用),但它不起作用。
我想我可以在ifelse
使用嵌套的grepl
语句但是可以使用switch
吗?
答案 0 :(得分:4)
根据手册,switch
这是不可能的,因为它只允许完全匹配:
开关(EXPR,...)
如果EXPR评估为字符串,则匹配该字符串 (确切地)到
...
中的元素名称。
但你可以在case_when
中使用dplyr
:
foo <- function(x){
dplyr::case_when(
grepl('^aa', x) ~ 'Apple',
x == 'bbbb' ~ 'Grape',
TRUE ~ 'Unknown'
)
}
foo(test)
# [1] "Apple" "Apple" "Grape"
答案 1 :(得分:2)
使用substr()
提取前两个字母;使用setNames()
传播全名而不是缩写到答案
> X = setNames(substr(test, 1, 2), test)
> sapply(X, switch, aa="Apple", bb = "Grape", "Unknown")
aabb aacc bbbb
"Apple" "Apple" "Grape"
答案 2 :(得分:0)
这可能有效:
regex_switch<-function(.v,...)
{
e<-enexprs(...)
i<-min(which(str_detect(.v,names(e))))
eval(e[[i]],parent.frame())
}
> map_chr(
c("aaaa","bb","aabbaa"),
regex_switch,
"^aa"="Apple","^bbbb"="Grape","^*$"="Unknown"
)
[1] "Apple" "Unknown" "Apple"
>