[R] value.labels

Uwe Ligges ligges at statistik.tu-dortmund.de
Thu Aug 11 19:27:13 CEST 2011



On 11.08.2011 19:22, David Winsemius wrote:
>
> On Aug 11, 2011, at 11:42 AM, Uwe Ligges wrote:
>
>>
>>
>> On 11.08.2011 16:10, zcatav wrote:
>>> Hello R people,
>>>
>>> I have a "data.frame". Status variable has 3 values. 0->alive,
>>> 1->dead and
>>> 2->missed
>>> Status as a factor have correct levels. Levels and labels output as
>>> follows;
>>>
>>> levels(Adbf$status); labels(Adbf$status)
>>> [1] "0" "1" "2"
>>> [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
>>> [11] "11" "12" "13" "14" "15" "16" "17" "18" "19" "20"
>>> [21] "21" "22" "23" "24" "25" "26" "27" "28" "29" "30"
>>> [31] "31" "32" "33" "34" "35" "36" "37" "38" "39" "40"
>>> [41] "41" "42" "43" "44" "45" "46" "47" "48" "49" "50"
>>>
>>> ........................................................................"644"
>>>
>>>
>>> Can i add value.labels to status variable? If yes how? Can i see these
>>> value.labels on results or graphics?
>>
>>
>> levels(Adbf$status) <- c("alive", "dead", "missed")
>
> I'm probably making some mistake, but my efforts to use something
> similar to that construction have caused me to "destroy" variables in
> the sense that I have made them all NA's. My more (defensive?,
> unnecessary?) practice has become:
>
> Adbf$status <- factor( Adbf$status, labels= c("alive", "dead", "missed") )
>
> When I try to use the `levels<-' operation now on what I think is a
> similar object, I get an error but maybe that relates to the fact that
> levels and labels are different?
>
>  > status <- factor( sample(1:50, 400, replace=TRUE) )
>  > status <- status[status %in% c("1", "2", "3")]
>  > str(status)
> Factor w/ 50 levels "1","2","3","4",..: 3 3 1 1 2 2 2 2 1 1 ...

Errr, this should have 3 levels, "0", "1", "2", actually.

>  > length(status)
> [1] 24
>  > levels(status) <- c("alive", "dead", "missed")
> Error in `levels<-.factor`(`*tmp*`, value = c("alive", "dead", "missed" :
> number of levels differs
>
> The real question I have as a follow-on is what is the "right way" to
> take an object like this:
>
> levels(testres) <- c(levels(testres), "NotDone")
>  > testres
> [1] 1 2 3 <NA>
> Levels: 1 2 3 NotDone
>
> ... and add a not done label?
>
> These do not "work":
> #1:
>  > levels(testres) <- c("NotDone", levels(testres))
>  > testres[4]
> [1] <NA>
> Levels: NotDone 1 2 3
>
> #2:
>  > testres <- factor(c(1,2,3,NA))
>  > levels(testres) <- c(levels(testres), "NotDone")
>  > testres[4]
> [1] <NA>
> Levels: 1 2 3 NotDone
>
> I have been converting to numeric, changing NA to 0 and then refactoring
> with labels=c("Not done", levels(old_factor) ), but that seems B(a)roke.

Hmm, when you want to add a level without changing the class of the 
factor object, you will have to add the level at first and then assign 
the level to the elements of the object. I'd probably rebuild the whole 
thing in that case.

As I understood the question, just how to rename the levels was the 
original question.

Uwe



More information about the R-help mailing list