[R] looping over factors

Douglas Bates bates at stat.wisc.edu
Sat Jan 31 14:22:39 CET 2004


mmiller3 at iupui.edu (Michael A. Miller) writes:

> >>>>> "Samuelson," == Samuelson, Frank* <Samuelson> writes:
> 
>     > How does one loop over factors? 
> 
> You can loop on the levels of your factor:
> 
> > b<-factor(c('caseX','caseY', 'caseZ', 'caseX'))
> > b
> [1] caseX caseY caseZ caseX
> Levels: caseX caseY caseZ
> > for ( i in levels(b) ) { print(i) }
> [1] "caseX"
> [1] "caseY"
> [1] "caseZ"

I don't think that will be what is intended.  The levels attribute is
the distinct character representations of values in the factor.  It
need not be the same length as the factor itself.

> myfac = factor(sample(LETTERS, 100, replace = TRUE))
> table(myfac)
myfac
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
6 2 4 5 2 3 7 6 3 7 6 3 8 3 1 3 3 5 2 4 2 2 5 4 2 2 
> length(levels(myfac))
[1] 26

By default the levels attribute is sorted lexicographically.

> for (ch in levels(myfac)) print(ch)
[1] "A"
[1] "B"
[1] "C"
[1] "D"
...
[1] "Y"
[1] "Z"

To iterate over the elements of myfac as character strings, use
as.character

> for (ch in as.character(myfac)) print(ch)
[1] "X"
[1] "L"
[1] "M"
[1] "W"
[1] "W"
...
[1] "E"
[1] "G"
[1] "H"

Hope this helps.




More information about the R-help mailing list