【问题标题】:Create a "Capitalize" function to work with vectors创建一个“Capitalize”函数来处理向量
【发布时间】:2016-05-06 09:48:59
【问题描述】:

这个问题是在这个问题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() 系列函数来创建一个新的更快的函数。

【问题讨论】:

    标签: r string sapply


    【解决方案1】:

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

    library(stringi)
    
    v1 <- c("heLlo", "ABC", "GooD daY")
    stri_trans_totitle(v1)
    
    ## [1] "Hello"    "Abc"      "Good Day"
    

    【讨论】:

      【解决方案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")
      

      【讨论】:

      • 抱歉给我解释得不好。我还想把其余的词去掉大写。我也编辑了我的问题以反映这一点。我希望每个单词都大写,而不是其他单词。感谢您的快速答复。
      • 两个答案都是正确的,但我测试过这种方式比另一种方式(处理时间)要快一些。
      猜你喜欢
      • 1970-01-01
      • 2014-11-12
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2022-01-05
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多