12

同事,

我正在查看类似于以下摘录的数据框:

Month   Provider Items
January CofCom   25
july    CofCom   331
march   vobix    12
May     vobix    0

我想将每个单词的第一个字母大写,并降低每个单词的剩余字母。这将导致数据框类似于以下数据框:

Month   Provider Items
January Cofcom   25
July    Cofcom   331
March   Vobix    12
May     Vobix    0

总之,我正在寻找与 MS Excel 中可用的ROPER函数等效的 R 函数。

4

4 回答 4

29

使用正则表达式:

x <- c('woRd Word', 'Word', 'word words')
gsub("(?<=\\b)([a-z])", "\\U\\1", tolower(x), perl=TRUE)
# [1] "Word Word"  "Word"       "Word Words"

(?<=\\b)([a-z])表示查找前面有单词边界的小写字母(例如,空格或行首)。(?<=...)被称为“后视”断言。\\U\\1说用它的大写版本替换那个字符。\\1是对模式中被包围的第一组的反向引用()。有关?regex更多详细信息,请参阅。

如果您只想将第一个单词的第一个字母大写,请改用该模式"^([a-z])

于 2014-07-25T13:40:58.377 回答
12

这个问题是关于 Excel 的等价物,PROPER(以前)接受的答案基于:

proper=function(x) paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2)))

可能值得注意的是:

proper("hello world")
## [1] "Hello world"

PROPER相反,Excel会给出“Hello World”。对于 Excel 的 1:1 映射,请参阅@Matthew Plourde。

如果您实际需要的只是将字符串的第一个字符设置为大写,您还可以考虑使用更短且速度稍快的版本:

proper=function(s) sub("(.)", ("\\U\\1"), tolower(s), pe=TRUE)
于 2016-03-02T16:55:18.657 回答
9

另一种方法使用 stringi 包。stri_trans_general 函数似乎将除首字母之外的所有字母小写。

require(stringi)
x <- c('woRd Word', 'Word', 'word words')
stri_trans_general(x, id = "Title")
[1] "Word Word"  "Word"       "Word Words"
于 2014-07-25T16:43:41.720 回答
5

我不认为有一个,但你可以很容易地自己写

(dat <- data.frame(x = c('hello', 'frIENds'),
                   y = c('rawr','rulZ'),
                   z = c(16, 18)))
#         x    y  z
# 1   hello rawr 16
# 2 frIENds rulZ 18

proper <- function(x)
  paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2)))


(dat <- data.frame(lapply(dat, function(x)
  if (is.numeric(x)) x else proper(x)),
  stringsAsFactors = FALSE))

#         x    y  z
# 1   Hello Rawr 16
# 2 Friends Rulz 18

str(dat)
# 'data.frame':  2 obs. of  3 variables:
#   $ x: chr  "Hello" "Friends"
#   $ y: chr  "Rawr" "Rulz"
#   $ z: num  16 18
于 2014-07-25T13:21:43.263 回答