如何编写R函数判断百分比前应使用不定冠词a还是an
如何编写R函数判断百分比前应使用不定冠词a还是an
我完全懂你的需求啦——就是要让R自动帮你判断百分比前面该用"a"还是"an",尤其是碰到8、11、18或者80-89开头的百分比(哪怕带小数,比如8.4%这种)的时候,得把"a"换成"an"对吧?你现在的函数只能匹配完全精确的字符串(比如"8%"),带小数的情况就失效了,咱们来调整一下!
核心问题是:我们需要匹配所有数字部分开头是8、11、18、80-89的百分比字符串,不管后面有没有小数。之前用%like%的方式太死板,不如用基础R的正则表达式来灵活匹配,而且不需要依赖额外包。
下面是修改后的函数,能完美覆盖你提到的所有场景:
text.a.an.num <- function(bob) { # 正则匹配:符合条件的百分比格式(整数/带小数都支持) if (grepl("^(8|1[18]|8[0-9])(\\.\\d+)?%$", bob)) { "an" } else { "a" } }
如果你需要批量处理多个百分比字符串(比如向量),可以改成用ifelse的版本,这样一次能处理一组值:
text.a.an.num <- function(bob) { ifelse(grepl("^(8|1[18]|8[0-9])(\\.\\d+)?%$", bob), "an", "a") }
来测试几个例子看看效果:
# 符合条件的情况,应该返回"an" text.a.an.num("8%") # an text.a.an.num("8.4%") # an text.a.an.num("11.2%") # an text.a.an.num("18%") # an text.a.an.num("85.7%") # an # 不符合条件的情况,返回"a" text.a.an.num("34.3%") # a text.a.an.num("12%") # a text.a.an.num("79%") # a # 批量测试向量 percents <- c("8%", "8.4%", "11%", "18.5%", "89%", "34.3%", "12%") text.a.an.num(percents) # 输出:"an" "an" "an" "an" "an" "a" "a"
简单解释下正则表达式的逻辑:
^:匹配字符串的开头,确保我们只看最前面的数字(8|1[18]|8[0-9]):匹配三种核心情况:8:单独以8开头的数字(比如8%、8.4%)1[18]:以11或18开头的数字(比如11%、18.5%)8[0-9]:以80到89开头的数字(比如80%、89.1%)
(\\.\\d+)?:这部分是可选的,用来匹配带小数的情况(比如.4、.2这些小数部分)%$:匹配字符串结尾的百分号,确保我们处理的是百分比格式的字符串
这样修改后,不管是整数百分比还是带小数的,都能准确判断该用"a"还是"an"啦!
备注:内容来源于stack exchange,提问作者Michael Collins
相关产品推荐
相关产品推荐

