2011-06-15 286 views
127

假设我有一个两个字的字符串,并且我想要使用它们的大写字母 。将两个单词中的第一个字母大写为两个字符串

name <- c("zip code", "state", "final count") 

Hmisc封装具有功能capitalize其资本的第一个字,但我不知道 如何让第二个字大写。 capitalize的帮助页面并不暗示它可以执行该任务。

library(Hmisc) 
capitalize(name) 
# [1] "Zip code" "State"  "Final count" 

我想:

c("Zip Code", "State", "Final Count") 

什么三个词串:

name2 <- c("I like pizza") 

回答

136

的基础R函数来执行市值toupper(x)。从?toupper帮助文件有这个功能已经做了你需要的东西:

simpleCap <- function(x) { 
    s <- strsplit(x, " ")[[1]] 
    paste(toupper(substring(s, 1,1)), substring(s, 2), 
     sep="", collapse=" ") 
} 

name <- c("zip code", "state", "final count") 

sapply(name, simpleCap) 

    zip code   state final count 
    "Zip Code"  "State" "Final Count" 

编辑这个工作,无论字的任何字符串,数:

simpleCap("I like pizza a lot") 
[1] "I Like Pizza A Lot" 
+7

如果这对其他人有帮助,记住通过在你的simpleCap函数中加入tolower函数,你也可以处理所有封顶的单词:是你可以处理的代码:
\t名称< - C( “乔治·华盛顿”, “汤姆杰弗逊”, “ABE LINCOLN”) \t simpleCap < - 函数(X){ \t小号< - tolower的(X) \t小号< - strsplit (一个或多个 “ ”)[[1]] \t糊(在toupper(子串(S,1,1)),子(S,2), \t \t月=“”,崩=”“) \t} \t sapply(name,simpleCap) – MatthewR 2014-09-03 18:22:29

+0

连字符名称如何?像Smith-Jones或Al-Rayon一样,可以作为SMITH-JONES或者al-rayon输入。 – 2015-01-05 14:44:35

+0

您可以使用'paste0()'代替'paste(...,sep =“”)''。简单一点。 – MERose 2015-08-06 23:37:18

19

尝试:

require(Hmisc) 
sapply(name, function(x) { 
    paste(sapply(strsplit(x, ' '), capitalize), collapse=' ') 
}) 
+0

记那么'Hmisc'可以覆盖'plyr'的'summarize'功能,如下所述:http://stackoverflow.com/a/35324305/288875 – 2016-08-06 09:09:00

+1

@AndreHolzner或者相反。 'Hmisc'比'plyr'更老一点... – 2017-06-12 12:21:55

13

?toupper帮助页面:

.simpleCap <- function(x) { 
    s <- strsplit(x, " ")[[1]] 
    paste(toupper(substring(s, 1,1)), substring(s, 2), 
      sep="", collapse=" ") 
} 


> sapply(name, .simpleCap) 

zip code   state final count 
"Zip Code"  "State" "Final Count" 
80

匹配的正则表达式开始之初^或之后空格[[:space:]],后面跟着一个字母字符[[:alpha:]]。全局(g中的g)用匹配的开始或空格和匹配的字母字符的大写版本\\1\\U\\2替换所有这些事件。这必须使用Perl风格的正则表达式匹配来完成。

gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", name, perl=TRUE) 
# [1] "Zip Code" "State"  "Final Count" 

在用于替换参数gsub()更详细一点,\\1说“使用的x匹配所述第一子表达式的部分”,即,x器官匹配(^|[[:spacde:]])。同样,\\2表示使用与第二个子表达式([[:alpha:]])匹配的部分x\\U通过使用perl=TRUE启用了语法,并且表示使下一个字符成为大写。因此,对于“邮政编码”,\\1是“Zip”,\\2是“代码”,\\U\\2是“代码”,而\\1\\U\\2是“邮政编码”。

?regexp页面有助于理解正则表达式,?gsub可以将事物放在一起。

+10

b!我原本是沿着这条路走下去的,但是错误地使用'\\ u'并且在意识到我应该把它大写之前放弃了......有点讽刺。这是我想出来的,没有对一个奇怪的球案'gsub(pattern =“\\ b([az])”,replacement =“\\ U \\ 1”,name,perl = TRUE)进行彻底审查。' – Chase 2011-06-15 23:09:43

+0

我试图在行名上使用它,它曾经工作过一次,但我无法重复。 – 2016-08-23 07:11:49

+0

对'tolower(name)'起作用如果还有其他帽子 – MichaelChirico 2016-10-06 03:18:14

62

使用此功能从stringi包串和regexpr

stri_trans_totitle(c("zip code", "state", "final count")) 
## [1] "Zip Code"  "State"  "Final Count" 

stri_trans_totitle("i like pizza very much") 
## [1] "I Like Pizza Very Much" 
+11

stringr包(如果tidyverse是你的东西)将'stri_tans_totitle'包装到一个名为'str_to_title()'的函数中。 这只是在封面下的stringi :: stri_trans_totitle(),但可能会保存加载另一个库(实际上,您可能已经加载),具体取决于您的工作流程。 – crazybilly 2016-09-21 13:52:36

5

替代方式:

substring(name, 1) <- toupper(substring(name, 1, 1)) 
pos <- regexpr(" ", name, perl=TRUE) + 1 
substring(name, pos) <- toupper(substring(name, pos, pos)) 
8

BBmisc现在包含的功能capitalizeStrings

library("BBmisc") 
capitalizeStrings(c("the taIl", "wags The dOg", "That Looks fuNny!") 
    , all.words = TRUE, lower.back = TRUE) 
[1] "The Tail"   "Wags The Dog"  "That Looks Funny!" 
15

备选:

library(stringr) 
a = c("capitalise this", "and this") 
a 
[1] "capitalise this" "and this"  
str_to_title(a) 
[1] "Capitalise This" "And This" 
57

没有为标题的情况下一个内置的基-R溶液以及:

tools::toTitleCase("demonstrating the title case") 
## [1] "Demonstrating the Title Case" 

library(tools) 
toTitleCase("demonstrating the title case") 
## [1] "Demonstrating the Title Case" 
+0

查看了源代码后,它显示该函数试图通过让大写字母开头除英文最可能的例外集合之外的所有单词来实现标题大小写(除了所有单词都以大写字母开头) 'c(“all”,“above”,“after”,“along”,“also”,“among”, “any”,“both”,“can”,“few”,“it”,“less “”,“日志”,“许多”, “可能”,“更多”,“超过”,“一些”,“他们”,“那么”,“这个” “,”von“,”when“,”where“,”which“, ”will“,”without“,”yet“,”you“,”your“)') – petermeissner 2016-07-26 11:45:10

+2

如果您期待ONLY首字母大写。 'tools :: toTitleCase(“HELLO”)'产生'HELLO'。您可能想首先围绕'tolower'进行换行,如下所示:'tools :: toTitleCase(tolower(“HELLO”))''返回'Hello' – ddunn801 2017-04-05 15:56:15

+0

好ppint - 仍然是它的标题大小写远 – petermeissner 2017-04-05 20:12:39

0
> require(stringr) 
Loading required package: stringr 
> str_to_title('the state of the union') 
[1] "The State Of The Union" 
+5

Brijesh的答案可能重复 – petermeissner 2016-10-03 20:26:24

1

您也可以使用snakecase包(它在内部包裹还建议stringi/stringr溶液):

> install.packages("snakecase") 
> library(snakecase) 

> name <- c("zip code", "state", "final count") 
> to_upper_camel_case(name, sep_out = " ") 
[1] "Zip Code" "State"  "Final Count" 

https://github.com/Tazinho/snakecase

0

这让大写字母所有主要的话

library(lettercase) 
xString = str_title_case(xString) 
+0

无法正常工作'> lettercase :: str_title_case(“HEY HELLO”) [1]“HEY HELLO”' – Tung 2018-02-13 07:58:45

+0

是的,我建议先使用tolower(x)。我在说'所有主要的话'时也犯了一个错误;这个函数在_all_单词上工作。 – 2018-02-14 10:07:16

+0

另一种选择:库(Hmisc)#大写功能 – 2018-02-24 19:35:21

相关问题