说我有以下的载体
x <- c('One', 'TWO', 'THREE / FOUR')
我想分别将TWO
和THREE / FOUR
转换为Two
和Three / Four
。我已经查看了casefold()
和整个chartr()
帮助页面,但无法弄清楚这一点。
在我真正的问题中,我有一个1500字符串的向量,我打算在其中检测以全部大写字母写的条目(我知道它们中的很多都包含斜线,就像上面示例中的斜杠一样)并将它们转换为start case
我可以做的一件事是运行grepl('^[A-Z]+$', x)
(由tenub建议),但它没有检测到THREE / FOUR
为全部大写(它产生[1] FALSE TRUE FALSE
)。从我所看到的情况来看,只有空格的存在就足以让这个回归FALSE
。
删除锚点grepl('[A-Z]+$', x)
(由TheGreatCO建议)适用于上面的示例,但在下一个示例中失败:
y <- "Imposto Territorial Rural - ITR"
grepl('[A-Z]+', y)
[1] TRUE
此外,无论我尝试什么,包含重音的元素总是被遗漏:
z <- c('Á')
grepl('[A-Z]+', z)
[1] FALSE
答案 0 :(得分:5)
部分内容是包gsubfn
中的演示示例。您可以在使用demo(gsubfn::gsubfn-lower)
安装软件包后运行它。
x <- c('One', 'TWO', 'THREE / FOUR', 'ÁÁÁ')
library(gsubfn)
## find indices of vector where there are no lowercase letters
## (therefore all letters must be uppercase)
idx <- grep("[[:lower:]]", x, invert = TRUE)
## in these indices, run tolower on characters
## that do not follow a word boundary \\B
x[idx] <- gsubfn("\\B.", tolower, x[idx], perl = TRUE)
# [1] "One" "Two" "Three / Four" "Ááá"
\B
和[:lower:]
都依赖于区域设置Sys.getlocale("LC_CTYPE")
。我的是"English_United States.1252"
。您的里程可能会有所不同。
答案 1 :(得分:-2)
我不太了解R,但我的答案基于gsub
的描述以及in this document给出的正则表达式支持
gsub("([A-Z])([:alpha:]*)", paste(\1,tolower(\2),sep=""), x)
我不确定你是否必须用引号括起\ 1和\ 2,尝试它,如果它不起作用,请尝试使用\ 1和\ 2的引号