我有一个(人类)名字的向量,全部用大写字母表示:
names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN")
到目前为止,要取消大写(仅大写第一个字母),我正在使用
simpleDecap <- function(x) {
s <- strsplit(x, " ")[[1]]
paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=" ")
}
sapply(names, simpleDecap, USE.NAMES=FALSE)
# [1] "Friedrich Schiller" "Frank O'hara" "Hans-christian Andersen"
但是我也想占
'
和 -
.使用 s <- strsplit(x, " |\\'|\\-")[[1]]
当然找到了正确的字母,但随后崩溃 '
和 -
迷路。因此,我试过simpleDecap2 <- function(x) {
for (char in c(" ", "\\-", "\\'")){
s <- strsplit(x, char)[[1]]
x <-paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=char)
} return x
}
sapply(名称,simpleDecap,USE.NAMES=FALSE)
但这当然更糟,因为结果一个接一个地拆分:
sapply(names, simpleDecap2, USE.NAMES=FALSE)
# [1] "Friedrich schiller" "Frank o'Hara" "Hans-christian andersen"
我认为正确的方法是根据
s <- strsplit(x, " |\\'|\\-")[[1]]
进行拆分,但 paste=
是问题所在。
最佳答案
这似乎有效,使用 Perl 兼容的正则表达式:
gsub("\\b(\\w)([\\w]+)", "\\1\\L\\2", names, perl = TRUE)
\L
将以下匹配组转换为小写。
关于r - 人名去大写(考虑 ' 和 -),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32760308/