这个问题出现在这个问题的头脑风暴之后Capitalize the first letter of both words in a two word string
我想编写一个接受向量的函数,它可以将句子中的每个单词都大写,然后对单词的其余部分进行去大写。仅将首字母大写更容易:
CapitalizeFirstWord <- function(vector) {
s <- sapply(sapply(vector, substring, 1, 1), toupper)
t <- sapply(sapply(vector, substring, 2), tolower)
binded <- cbind(s,t)
apply(binded, 1, paste, collapse= "")
}
这样CapitalizeFirstWord(c("heLlo", "ABC", "GooD daY"))
会产生
heLlo ABC GooD daY
"Hello" "Abc" "Good day"
(帮助解决了这个问题Paste multiple columns together)
但是我无法使其成功,所以句子中的每个单词都是大写的。
这是我失败的尝试:
CapitalizeEveryWord <- function(vector) {
vectorS <- sapply(vector, strsplit, " ")
s <- sapply(sapply(vectorS, substring, 1, 1), toupper)
t <- sapply(sapply(vectorS, substring, 2), tolower)
binded <- cbind(s,t)
apply(binded, 1, paste, collapse= "")
}
这样CapitalizeEveryWord(c("heLlo", "ABC", "GooD daY"))
会产生
heLlo ABC GooD daY
"Hello" "Abc" "c(\"G\", \"D\")c(\"ood\", \"ay\")"
我不知道如何更改cbind()
或paste()
函数'的行为,以便正确重新排列。
我正在做这项工作,因为我有一个非常大的数据框,其大部分字符串大写。
脚本应该尽可能少地消耗时间(因为使用for()
循环迭代,对于每一行并且仅大写第一个字母,是非常慢的,并且我遇到问题与它并行化{ {1}})。这就是为什么我使用parLapply()
函数族来创建一个新的更快的函数。
答案 0 :(得分:3)
使用内置函数来完成stringi
:
library(stringi)
v1 <- c("heLlo", "ABC", "GooD daY")
stri_trans_totitle(v1)
## [1] "Hello" "Abc" "Good Day"
答案 1 :(得分:2)
我们可以使用gsub
gsub("\\b(.)", "\\U\\1", tolower(v1), perl=TRUE)
#[1] "Hello" "Abc" "Good Day"
如果只是将第一个词大写
sub("(.)", "\\U\\1", tolower(v1), perl=TRUE)
#[1] "Hello" "Abc" "Good day"
v1 <- c("heLlo", "ABC", "GooD daY")