创建一个 "Capitalize" 函数来处理向量

Create a "Capitalize" function to work with vectors

这个问题是在对这个问题进行头脑风暴之后提出的 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() 循环迭代,对于每一行并且只将第一个字母大写,非常慢,而且我在并行工作时遇到了问题parLapply())。这就是为什么我使用 *apply() 系列函数来创建一个新的更快的函数。

我们可以使用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")

使用来自 stringi 的这个确切用例的内置函数:

library(stringi)

v1 <- c("heLlo", "ABC", "GooD daY")
stri_trans_totitle(v1)

## [1] "Hello"    "Abc"      "Good Day"