大写字母。 R相当于excel“PROPER”功能[重复]

Posted

技术标签:

【中文标题】大写字母。 R相当于excel“PROPER”功能[重复]【英文标题】:Capitalizing letters. R equivalent of excel "PROPER" function [duplicate] 【发布时间】:2014-09-17 08:33: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 函数。

【问题讨论】:

?tolower帮助页面中查看capwords函数 ?tolower 的示例部分定义了一个capwords 函数。 【参考方案1】:

使用正则表达式:

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

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

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

【讨论】:

这是实际答案。我敦促提问者重新考虑他们的检查。 是否需要反向引用?这不会给出相同的结果吗? gsub("(\\b[a-z])", "\\U\\1", tolower(xx), perl=TRUE) 这不适用于所有语言,因为这也会在特殊字符(例如变音符号)之后大写字母。【参考方案2】:

该问题与 Excel PROPER 等效,(以前)接受的答案基于:

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

可能值得注意的是:

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

Excel PROPER 会改为“Hello World”。对于 Excel 的 1:1 映射,请参阅@Matthew Plourde。

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

proper=function(s) sub("(.)", ("\\U\\1"), tolower(s), pe=TRUE)

【讨论】:

【参考方案3】:

另一种方法使用 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"

【讨论】:

对于未来的访问者:stringi 有一个名为stri_trans_totitle 的函数,它可以做同样的事情。不确定在这个答案时是否存在。【参考方案4】:

我认为没有,但你可以很容易地自己写它

(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

【讨论】:

谢谢,这就是我要找的。这是一件好事,应该成为基地的一部分:) 请注意,在我应用此函数后,函数中的可用数字列已更改为因子,这使图表有些混乱,因此我不得不再次将其设为数字​​。 @Konrad 那种情况,我会,data.frame(lapply(dat, function(x) if(is.numeric(x)) x else proper(x))) 或类似的东西 非常感谢,这是非常有用的解决方案。我想知道将if(is.numeric 部分移动到函数本身是否明智。 你也可以这样做。您还可以扩展该功能以以不同方式处理不同的类

以上是关于大写字母。 R相当于excel“PROPER”功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在excel里输入英文,怎么将第一个字母自动的变成大写

怎么使excel中英文字母第一个字母为大写

Excel大小写转换函数

R语言数据集行列互换技巧

正则表达式

R语言—tidyr