大写字母。 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"
(?<=\\b)([a-z])
表示查找前面有单词边界的小写字母(例如,空格或行首)。 (?<=...)
被称为“后视”断言。 \\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”功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章