2012-06-19 29 views
4

使用基本安装函数什么是最大化文本字符串矢量中第一个字母的最快方法?将字符串中第一个字母大写的最快方法(基数)

我在下面提供了一个解决方案,但它似乎是一个非常低效的方法(使用子字符串并将它粘贴在一起)。我猜想有一个我没有想到的正则表达式解决方案。

一旦我有一些回应,我会对它们进行基准测试,并使用微基准标记报告最快的解决方案。

非常感谢您的帮助。

x <- c("i like chicken.", "mmh so good", NA) 
#desired output 
[1] "I like chicken." "Mmh so good"  NA 

回答

1

我的解决方案使用子:

capitalize <- function(string) { 
    cap <- function(x) { 
     if (is.na(x)) { 
      NA 
     } 
     else { 
      nc <- nchar(x) 
      paste0(toupper(substr(x, 1, 1)), substr(x, 
       2, nc)) 
     } 
    } 
    sapply(string, cap, USE.NAMES = FALSE) 
} 

x <- c("i like chicken.", "mmh so good", NA) 
capitalize(x) 
5

我没火候,但我敢打赌,这是相当快

capitalize <- function(string) { 
    #substring(string, 1, 1) <- toupper(substring(string, 1, 1)) 
    substr(string, 1, 1) <- toupper(substr(string, 1, 1)) 
    string 
} 
capitalize(x) 
#[1] "I like chicken." "Mmh so good"  NA 
+0

很不错 我喜欢。不知道你可以分配给子字符串+1 –

+0

只是比较它与'substr'; 'substring'稍微快一点 – GSee

+0

hmmm,第二次看,'substr'更快 – GSee

4

我认为这将是最慢的,但让它与其他解决方案竞赛:

capitalize<-function(string) { 
    sub("^(.)","\\U\\1", string, perl=TRUE) 
} 

x <- c("i like chicken.", "mmh so good", NA) 
capitalize(x) 

编辑:实际上ideone它比子串更快

编辑2:匹配任何小写字母原来是稍慢:

sub("^(\\p{Ll})","\\U\\1", string, perl=TRUE) 
+0

+1 - 你只是打我发贴。我会删除我的。 – thelatemail

+0

我只是在开玩笑! ;) –

+0

别担心,我没有把它放在心上。只是没有太多的观点两次有相同的答案! :-P – thelatemail

3

Hmisc包包含一个capitalize功能:

> require(Hmisc) 
> capitalize(c("i like chicken.", "mmh so good", NA)) 
[1] "I like chicken." "Mmh so good"  NA 

(虽然这似乎比substring和正则表达式版本都要慢)。

+0

+1看到它在内部使用'substr'使我重新测试我的,现在我得到'substr'比'substring'更好 – GSee

相关问题