On Dec 2, 2012, at 12:46 PM, Audrey wrote:
> I am trying to write a function to change the case of all of the
> text in a
> data frame to lower case.
Define what you mean by "text".
> I do not have foreknowledge of the data frame
> names or the data types of each column.
>
> It seems that if one references the data frame by index, then it
> returns
> class "data.frame" but if it is referenced by name, it returns
class
> "factor" or whatever the column actually is:
> dat[1] returns class "data.frame" but
> dat$name returns class "factor"
Yes. That is correct.>
> The problem is that, when one applies the tolower() and toupper()
> functions,
> dat$name will return a column of lower/uppercase returns (now class
> "character") but dat[1] will return an array of factor level
indexes.
It return an integer vector with attributes: class = factor and levels.
> Specifying dat[1] as.character during the function call does not
> work (e.g.
> tolower(as.character(dat[1]))).
Because dat[1] is a list, not a vector.
>
> So, I would loop over the column names, but I can not figure out how
> to
> generically call them:
> tst=names(dat);
> dat$(tst[1]) returns an error
> dat[tst[1]] returns class data.frame again
>
> Thank you in advance!
>
> change_case<-function(dat,wcase){
> # change case
> res=sapply(dat,class); # get classes
> ind<-res=='character';
> dat[ind]<-switch(wcase,
> 'lower'=tolower(dat[ind]),
> 'upper'=toupper(dat[ind])
> )
> rm(ind);
> ind<-res=='factor';
> dat[ind]<-switch(wcase,
> 'lower'=factor(tolower(as.character(dat[ind]))),
> 'upper'=factor(toupper(as.character(dat[ind])))
> )
> return(dat);
> }
You probably need to study the help("[") page and learn the difference
between "[" and "[[". Changing to "[[" in a couple
of places would
probably allow success.
--
David Winsemius, MD
Alameda, CA, USA