创建一个“大写”功能来处理向量

时间:2016-05-06 09:48:59

标签: r string sapply

这个问题出现在这个问题的头脑风暴之后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()函数族来创建一个新的更快的函数。

2 个答案:

答案 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")