大写字母。R相当于excel“;“适当的”;功能

大写字母。R相当于excel“;“适当的”;功能,r,string,capitalization,toupper,tolower,R,String,Capitalization,Toupper,Tolower,各位同事: 我看到的是一个类似以下摘录的数据框: 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 Vobi

各位同事:

我看到的是一个类似以下摘录的数据框:

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中可用的函数R等价的函数。

我认为没有,但您可以自己轻松编写

(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

(带正则表达式的dat:

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

x另一种方法使用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"
require(stringi)

x该问题是关于Excel
property
的等价物,而(前者)公认的答案基于:

proper=function(x) paste0(toupper(substr(x, 1, 1)), tolower(substring(x, 2)))
值得注意的是:

proper("hello world")
## [1] "Hello world"
Excel
property
会给出“Hello World”。有关Excel的1:1映射,请参见@Matthew Plourd

如果您真正需要的是只将字符串的第一个字符设置为大写字母,您也可以考虑较短且稍快的版本:

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

请参见
?tolower
帮助页面中的
capwords
函数在
?tolower
的示例部分中定义了一个
capwords
函数。谢谢,这是我一直在寻找的。这是一个非常好的东西,应该是基础的一部分:)只需提醒一句,在我应用此函数后,函数中可用的数字列被更改为factor,这使图表有点混乱,因此我不得不再次将其设置为数字。@Konrad如果是这种情况,我会,
data.frame(lappy(dat,function(x)if(is.numeric(x))x else property(x)))
或类似的东西非常感谢,这是非常有用的解决方案。我想知道如果(is.numeric
是函数本身的一部分。您也可以这样做。您还可以扩展函数以不同的方式处理不同的类。这是实际的答案。我敦促提问者重新考虑他们的检查。是否需要反向引用?这不会给出相同的结果吗?
gsub(\\b[a-z]),“\\U\\1”,tolower(xx),perl=TRUE)
这并不适用于所有语言,因为它还将特殊字符后的字母大写(例如umlauts)。对于未来的访问者:stringi有一个名为
stri_trans_totitle
的函数,它做同样的事情。不确定在回答此问题时是否存在。