[R] reordering levels error

David Winsemius dwinsemius at comcast.net
Tue Aug 31 00:19:31 CEST 2010


On Aug 30, 2010, at 6:09 PM, Felipe Carrillo wrote:

> Sorry about the structure thing, I basically want my levels on this  
> order:
>  w_melt <-
> reorder(w_melt 
> $year,c("BY2005","BY2009","BY2006","BY2008","BY2007","BY2010"))
>  Here's the new dataset , please discard the reverse year, I was  
> just trying it
> but it didn't do what I wanted
> and forgot to delete it.
> With ggplot2 I am trying to show the line with max value above and  
> then show the
> other lines in the same order as the w_melt reorder code above.

I cannot parse that into English ... too many references to undefined  
items and indefinite pronouns to arrive at a meaningful expanded  
sentence. "Max value above"? "Other lines in order"? Try your plotting  
with the simple modification offered below and then report back with  
more detail and fewer indefinite pronouns and vague "as aboves".

>
> winter <- structure(list(week = c(26L, 27L, 28L, 29L, 30L, 31L, 32L,  
> 33L,
> 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L,
> 47L, 48L, 49L, 50L, 51L, 52L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,
> 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L,
> 22L, 23L, 24L, 25L, 26L), BY2010 = c(0L, 0L, 460L, 1126L, 1755L,
> 11153L, 27998L, 56336L, 12486L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
> 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
> 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
> 0L, 0L, 0L, 0L), BY2009 = c(0L, 95L, 341L, 373L, 2859L, 5769L,
> 33263L, 98435L, 345339L, 622621L, 349958L, 531232L, 652803L,
> 345358L, 142991L, 148883L, 957501L, 32495L, 14862L, 7210L, 9765L,
> 6846L, 5067L, 6201L, 3045L, 106230L, 1183L, 195L, 6855L, 10261L,
> 4179L, 650L, 240L, 165L, 1189L, 863L, 562L, 1350L, 188L, 479L,
> 770L, 0L, 558L, 314L, 147L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
>     BY2008 = c(0L, 0L, 77L, 124L, 159L, 2376L, 9480L, 17314L,
>     99574L, 323679L, 198211L, 93630L, 129183L, 111820L, 71260L,
>     35241L, 14020L, 20778L, 21694L, 15016L, 13400L, 9187L, 3607L,
>     2804L, 2417L, 5291L, 16216L, 898L, 558L, 709L, 972L, 61L,
>     372L, 3086L, 10108L, 4295L, 882L, 2593L, 36L, 233L, 243L,
>     0L, 70L, 272L, 308L, 134L, 40L, 0L, 0L, 0L, 0L, 0L, 0L),
>     BY2007 = c(0L, 0L, 0L, 10775L, 4166L, 4958L, 16221L, 29401L,
>     34951L, 33188L, 146044L, 105007L, 185297L, 159682L, 207537L,
>     140694L, 128275L, 44274L, 27079L, 18928L, 10437L, 29984L,
>     18395L, 25846L, 4573L, 31995L, 3679L, 1043L, 9636L, 1524L,
>     827L, 7009L, 233L, 433L, 0L, 1103L, 257L, 128L, 66L, 70L,
>     535L, 429L, 97L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
>     BY2006 = c(0L, 707L, 2390L, 8860L, 24430L, 40885L, 72792L,
>     205521L, 344493L, 662973L, 526409L, 631953L, 850491L, 842678L,
>     445987L, 558152L, 332032L, 174326L, 80601L, 48696L, 98571L,
>     103563L, 149469L, 78081L, 182478L, 2158L, 16566L, 4027L,
>     2655L, 1112L, 567L, 2595L, 4976L, 6336L, 294L, 1758L, 291L,
>     203L, 450L, 1098L, 788L, 195L, 532L, 0L, 0L, 0L, 0L, 0L,
>     0L, 167L, 0L, 0L, 0L), BY2005 = c(0L, 0L, 868L, 2044L, 4064L,
>     6049L, 9399L, 13304L, 45172L, 242155L, 476864L, 712534L,
>     1058409L, 2115018L, 1510342L, 1138213L, 333192L, 158820L,
>     94379L, 348882L, 39290L, 29701L, 47258L, 69837L, 7884L, 49338L,
>     22168L, 19397L, 19397L, 15984L, 8688L, 1200L, 1623L, 1291L,
>     1356L, 707L, 875L, 875L, 222L, 883L, 0L, 0L, 129L, 0L, 0L,
>     0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("week", "BY2010",
> "BY2009", "BY2008", "BY2007", "BY2006", "BY2005"), class =  
> "data.frame",
> row.names = c(NA,
> -53L))
> winter
>  w_melt <- melt(winter,id="week",variable="year");str(w_melt)
>  #  Reorder DOESN'T WORK
>  w_melt <-
> reorder(w_melt 
> $year,c("BY2005","BY2009","BY2006","BY2008","BY2007","BY2010"))
Let's drop you misguided use of reorder and use the correct method for  
reversing the print order of a factor. (Let's also drop the misguided  
assignment of a factor to what is the name of hte entire dataset.)


  w_melt$year <- factor(w_melt$year, levels= rev(levels(w_melt$year) ) )
# Should reverse the order

> pdf("wtest.pdf")
> ggplot(w_melt,aes(week,value/1000,colour)) + geom_line(size=.75)+   
> theme_bw() +
> opts(title="Cumulative",axis.text.x = theme_text(angle=45,hjust=1)) +
>  labs(y="Number of individuals X 1,000",x="week")
> dev.off()
>
> Felipe D. Carrillo
> Supervisory Fishery Biologist
> Department of the Interior
> US Fish & Wildlife Service
> California, USA
>
>
>
> ----- Original Message ----
>> From: David Winsemius <dwinsemius at comcast.net>
>> To: r-help Help <r-help at stat.math.ethz.ch>
>> Sent: Mon, August 30, 2010 2:49:15 PM
>> Subject: Re: [R] reordering levels error
>>
>>
>> On Aug 30, 2010, at 5:25 PM, Felipe Carrillo wrote:
>>
>>> Please consider the following dataset:
>>> I want to reorder the levels by year but get the following error:
>>>
>>> Error in tapply(v, x, FUN, ...) : arguments must have same length
>>>
>>> I suspect that I need to add the levels before I melt the dataset
>>>   but either way I have only use 'reorder' once before and can't  
>>> figure
>>>   out how it works..Thanks for any advice.
>>>
>>> winter <- (list(week = c(26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L,
>>
>> I believe you omitted a necessary"structure" call above.
>>
>>> 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L,
>>> 47L, 48L, 49L, 50L, 51L, 52L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,
>>> 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L,
>>> 22L, 23L, 24L, 25L, 26L), BY2010 = c(0L, 0L, 460L, 1126L, 1755L,
>>> 11153L, 27998L, 56336L, 12486L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
>>> 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
>>> 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
>>> 0L, 0L, 0L, 0L), BY2009 = c(0L, 95L, 341L, 373L, 2859L, 5769L,
>>> 33263L, 98435L, 345339L, 622621L, 349958L, 531232L, 652803L,
>>> 345358L, 142991L, 148883L, 957501L, 32495L, 14862L, 7210L, 9765L,
>>> 6846L, 5067L, 6201L, 3045L, 106230L, 1183L, 195L, 6855L, 10261L,
>>> 4179L, 650L, 240L, 165L, 1189L, 863L, 562L, 1350L, 188L, 479L,
>>> 770L, 0L, 558L, 314L, 147L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
>>>     BY2008 = c(0L, 0L, 77L, 124L, 159L, 2376L, 9480L, 17314L,
>>>     99574L, 323679L, 198211L, 93630L, 129183L, 111820L, 71260L,
>>>     35241L, 14020L, 20778L, 21694L, 15016L, 13400L, 9187L, 3607L,
>>>     2804L, 2417L, 5291L, 16216L, 898L, 558L, 709L, 972L, 61L,
>>>     372L, 3086L, 10108L, 4295L, 882L, 2593L, 36L, 233L, 243L,
>>>     0L, 70L, 272L, 308L, 134L, 40L, 0L, 0L, 0L, 0L, 0L, 0L),
>>>     BY2007 = c(0L, 0L, 0L, 10775L, 4166L, 4958L, 16221L, 29401L,
>>>     34951L, 33188L, 146044L, 105007L, 185297L, 159682L, 207537L,
>>>     140694L, 128275L, 44274L, 27079L, 18928L, 10437L, 29984L,
>>>     18395L, 25846L, 4573L, 31995L, 3679L, 1043L, 9636L, 1524L,
>>>     827L, 7009L, 233L, 433L, 0L, 1103L, 257L, 128L, 66L, 70L,
>>>     535L, 429L, 97L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
>>>     BY2006 = c(0L, 707L, 2390L, 8860L, 24430L, 40885L, 72792L,
>>>     205521L, 344493L, 662973L, 526409L, 631953L, 850491L, 842678L,
>>>     445987L, 558152L, 332032L, 174326L, 80601L, 48696L, 98571L,
>>>     103563L, 149469L, 78081L, 182478L, 2158L, 16566L, 4027L,
>>>     2655L, 1112L, 567L, 2595L, 4976L, 6336L, 294L, 1758L, 291L,
>>>     203L, 450L, 1098L, 788L, 195L, 532L, 0L, 0L, 0L, 0L, 0L,
>>>     0L, 167L, 0L, 0L, 0L), BY2005 = c(0L, 0L, 868L, 2044L, 4064L,
>>>     6049L, 9399L, 13304L, 45172L, 242155L, 476864L, 712534L,
>>>     1058409L, 2115018L, 1510342L, 1138213L, 333192L, 158820L,
>>>     94379L, 348882L, 39290L, 29701L, 47258L, 69837L, 7884L, 49338L,
>>>     22168L, 19397L, 19397L, 15984L, 8688L, 1200L, 1623L, 1291L,
>>>     1356L, 707L, 875L, 875L, 222L, 883L, 0L, 0L, 129L, 0L, 0L,
>>>     0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("week", "BY2010",
>>> "BY2009", "BY2008", "BY2007", "BY2006", "BY2005"), class =  
>>> "data.frame",
>>> row.names = c(NA,
>>> -53L))
>>>   str(winter)
>>>   w_melt <- melt(winter,id="week",variable="year");str(w_melt)
>>>   #  Reorder
>>
>> Of course it "DOESN'T WORK". The second argument is much shorter  
>> than the
>> first.
>>
>>>   w_melt <-
>>>
> reorder(w_melt 
> $year,c("BY2005","BY2009","BY2006","BY2008","BY2007","BY2010"))
>>
>>> ?reorder
>>
>> (Not that you would want to have it "work" for the reasons cited  
>> below.)
>>
>> Apparently all you want to do is reverse the ordering of w_melt 
>> $year, so
>> assigning the output of reorder to what used to be a full dataframe  
>> is going to
>> create havoc.
>>
>>>   w_melt <- melt(winter,id="week",variable="year");str(w_melt)
>> 'data.frame':    318 obs. of  3 variables:
>> $ week : int  26 27 28 29 30 31 32 33 34 35 ...
>> $ year : Factor w/ 6 levels "BY2010","BY2009",..: 1 1 1 1 1 1 1 1 1  
>> 1 ...
>> $ value: int  0 0 460 1126 1755 11153 27998 56336 12486 0 ...
>>>
>>>   w_melt <- melt(winter,id="week",variable="year");str(w_melt)
>> 'data.frame':    318 obs. of  3 variables:
>> $ week : int  26 27 28 29 30 31 32 33 34 35 ...
>> $ year : Factor w/ 6 levels "BY2010","BY2009",..: 1 1 1 1 1 1 1 1 1  
>> 1 ...
>> $ value: int  0 0 460 1126 1755 11153 27998 56336 12486 0 ...
>>> levels(w_melt$year)
>> [1] "BY2010" "BY2009" "BY2008" "BY2007" "BY2006" "BY2005"
>>
>> So try instead:
>>
>>> w_melt$year <- reorder(w_melt$year, 7-as.numeric(w_melt$year))
>>> levels(w_melt$year)
>> [1] "BY2005" "BY2006" "BY2007" "BY2008" "BY2009" "BY2010"
>>
>> You have not described what you are trying to show, so I have not  
>> proceeded any
>> further.
>>
>>> pdf("wtest.pdf")
>>> ggplot(w_melt,aes(week,value/1000,colour=year,order= -  
>>> as.numeric(year))) +
>>> geom_line(size=.75)+  theme_bw() +
>>> opts(title="Cumulative",axis.text.x =  
>>> theme_text(angle=45,hjust=1)) +
>>>   labs(y="Number of individuals X 1,000",x="week")
>>> dev.off()
>>>
>>> Felipe D. Carrillo

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list