# [R] case conversion and/or string comparison

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Nov 16 13:48:59 CET 2001

```On Fri, 16 Nov 2001, Randall Skelton wrote:

> This is no doubt trivial but after searching the help files and the web, I
> cannot seem to find it.
>
> 1) How do I convert 'hgt' into 'HGT' in R?

Use toupper().

> 2) How should I have used the help facilities to find this?

We need real keywords in the help system. One day ....

> At the end of the day, all I want to do is case insensitive string
> matching... i.e. 'if ("HGT" == 'hgt') print('this should be true')'

As in fitdistr (in MASS) which has

distname <- tolower(densfun)
densfun <- switch(distname, beta = dbeta, cauchy = dcauchy,
"chi-squared" = dchisq, exponential = dexp, f = df,
gamma = dgamma, "log-normal" = dlnorm, lognormal = dlnorm,
logistic = dlogis, "negative binomial" = dnbinom,
normal = dnorm, t = mydt, uniform = dunif, weibull = dweibull,
NULL)
....

> I tried using some of the regular expression tools but I had some trouble
> interpreting the results:
>
>  > grep("HGT", "hgt", ignore.case = T)
>  [1] 1
>  > grep("HGT", "tem", ignore.case = T)
>  numeric(0)
>
> This appears to be what I want. However, putting an 'if' around this
> fails for the false case.
>
>  > if ( grep("HGT", "tem", ignore.case = T) ) print('hi');
>  Error in if (grep("HGT", "tem", ignore.case = T)) print("hi") :
>          argument of if(*) is not interpretable as logical
>
> I suppose that R cannot interpret 'if (numeric(0))'.  I would think the
> following would work?
>
>  > grep("HGT", "hgt", ignore.case = T) == 1
>  [1] TRUE
>  > grep("HGT", "tem", ignore.case = T) == 1
>  logical(0)
>
> Note that the bottom is not 'FALSE'?  Why?
>
>  > if (grep("HGT", "tem", ignore.case = T) == 1) print('hi');
>  Error in if (grep("HGT", "tem", ignore.case = T) == 1) print("hi") :
>          missing value where logical needed
>
> I suppose that R cannot interpret 'if (logical(0))' either?

Right.  You would do better to use regexpr than grep.

>
> So my question is:  How to I return a logical 'TRUE/FALSE' when
> comparing 2 strings?  Clearly, I am missing something.
>
> Randall
>
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
>

--
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272860 (secr)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```