[R] factor always have type integer

Erich Neuwirth erich.neuwirth at univie.ac.at
Wed Sep 8 23:54:23 CEST 2004


The function I need is
valtype<-function(x)
	typeof(ifelse(is.factor(x),levels(x),x))

It is easy enough to write.
Are there any other special cases where the values
and the storage mode differ?

The background for all this is that I am transferring data
from R to Excel with VBA and I have to handle numbers
and strings differently. So I need to check for the type
of values I will get returned before I do the transfer.

Therefore, I would like to know if there are other types of variables
(besides factors) which give a misunderstandable answer about the type 
of their values when asked typeof.




Prof Brian Ripley wrote:

> On Wed, 8 Sep 2004, Erich Neuwirth wrote:
> 
> 
>>typeof applied to a factor always seems to return "integer",
>>independently of the type of the levels.
> 
> 
> typeof is telling you the internal structure. From ?factor
> 
>      'factor' returns an object of class '"factor"' which has a set of
>      integer codes the length of 'x' with a '"levels"' attribute of
>      mode 'character'. 
> 
> (Despite that, we don't enforce this and people have managed to create 
> factors with non-integer numeric codes.)
> 
> Now ?typeof says
> 
>      'typeof' determines the (R internal) type or storage mode of any
>      object
> 
> and that is the "integer" as the codes are stored in an INTSXP.
> 
> BTW, factors were an internal type long ago, and were one of the two
> unnamed types which appear in output from memory.profile().
> 
> 
>>This has a strange side effect.
> 
> 
> It's a very well documented feature of data.frame, as others have 
> pointed out.
> 
> 
>>When a variable is "imported" into a data frame,
>>its type changes.
>>character variables automatically are converted
>>to factors when imported into data frames.
>>
>>Here is an example:
>>
>> > v1<-1:3
>> > v2<-c("a","b","c")
>> > df<-data.frame(v1,v2)
>> > typeof(v2)
>>[1] "character"
>> > typeof(df$v2)
>>[1] "integer"
>>
>>It is somewhat surprising that
>>the types of v2 and df$v2 are different.
>>
>>the answer is to do
>>levels(df$v2)[df$v2]
>>but that is somewhat involved.
>>
>>Should the types not be identical, and typeof applied to factors
>>return the type of the levels?
>>
>>
>>
> 
> 


-- 
Erich Neuwirth, Computer Supported Didactics Working Group
Visit our SunSITE at http://sunsite.univie.ac.at
Phone: +43-1-4277-38624 Fax: +43-1-4277-9386




More information about the R-help mailing list