[R] Groups and bwplot

Sébastien Bihorel pomchip at free.fr
Mon Aug 22 15:37:41 CEST 2011


I got it to works. The problem was mainly how data were passed to my
panel and panel.groups function. For reference, here is what I ended
with:

require(lattice)

mybwplot <- function(x,y,data,group){

  if (missing(group)||is.null(group)) {
    group <- 'NULL'
    ngroups <- 1
  } else {
    data[[group]] <- as.factor(data[[group]])
    ngroups <- nlevels(data[[group]])
  }

  mywidth <- 1/(ngroups+1)

  mypanel <- function(x,y,groups,...){
    if (missing(groups) || is.null(groups) || ngroups==1) {
      panel.bwplot(x=x,y=y,...)
    } else {
      panel.superpose(x=x,y=y,groups=groups,...)
    }
  }

  mypanel.groups <- function(x,y,ngroups,group.number,...){
    if (ngroups==1) {
      NULL
    } else {
      panel.bwplot(x+(group.number-0.5*(ngroups+1))/(ngroups+1),y, ...)
    }
  }

  if (!is.null(group)) group <- data[[group]]

  bwplot(formula(paste(y,x,sep='~')),
         data = data,
         ngroups = ngroups,
         groups = group,
         pch = "|",
         box.width = mywidth,
         panel = mypanel,
         panel.groups = mypanel.groups)

}

myCO2 <- CO2
myCO2$year <- 2011

mybwplot('Type','uptake',myCO2) # works

mybwplot('Type','uptake',myCO2,'Treatment') # works

mybwplot('Type','uptake',myCO2,'year') # works



On Sat, Aug 20, 2011 at 1:35 PM, Sébastien Bihorel <pomchip at free.fr> wrote:
> Thanks for your input and this link. I realize that there was a typo
> in my example code that impacted the group argument... That's king of
> stupid.
>
> However, even with the implementation of Felix's syntax, the "Error
> using packet 1, 'x' is missing" error message is still displayed, even
> if the call appears correct. So I believe that group argument in not
> the issue but rather my panel functions. (Plus, Felix's notation
> creates side-issues such as the calculation of ngroups, which I have
> hard-coded in the following modified example).
>
> require(lattice)
>
> mybwplot <- function(x,data,groups){
>
>  if (missing(groups)) {
>    ngroups <- 1
>  } else {
>    ngroups <- 2
>  }
>
>  mywidth <- 1/(ngroups+1)
>
>  mypanel <- function(x,y,groups,...){
>    if (missing(groups)||is.null(groups)) {
>      panel.bwplot(x,y,...)
>    } else {
>      panel.superpose(x,y,...)
>    }
>  }
>
>  mypanel.groups <- function(x,y,groups,ngroups,group.number,...){
>    if (missing(groups)||is.null(groups)){
>      NULL
>    } else {
>      panel.bwplot(x+(group.number-0.5*(ngroups+1))/(ngroups+1),y, ...)
>    }
>  }
>
>  ccall <- quote(bwplot(x,
>                        data = data,
>                        ngroups=ngroups,
>                        pch = "|",
>                        box.width = mywidth,
>                        panel = mypanel,
>                        panel.groups = mypanel.groups))
>  ccall$groups <- substitute(groups)
>  str(ccall)
>  eval(ccall)
>
> }
>
> myCO2 <- CO2
> myCO2$year <- 2011
>
> mybwplot(uptake~Type,myCO2) # works
>
> mybwplot(uptake~Type,myCO2,groups=Treatment) # Error using packet 1,
> 'x' is missing
>
> #mybwplot(uptake~Type,myCO2,groups=year) # Error using packet 1, 'x' is missing
>
> # Deepayan Sarkar suggested code (adapted to myC02)
> # bwplot(uptake ~ Type, data = myCO2, groups = Treatment,
> #        pch = "|", box.width = 1/3,
> #        panel = panel.superpose,
> #        panel.groups = function(x, y, ..., group.number) {
> #            panel.bwplot(x + (group.number-1.5)/3, y, ...)
> #        })
>
> On Sat, Aug 20, 2011 at 11:38 AM, Weidong Gu <anopheles123 at gmail.com> wrote:
>> You may want to consult a recent post by Felix
>> (https://stat.ethz.ch/pipermail/r-help/2011-August/286707.html) on how
>> to pass group parameter.
>>
>> Weidong Gu
>>
>> On Sat, Aug 20, 2011 at 6:59 AM, Sébastien Bihorel <pomchip at free.fr> wrote:
>>> Dear R-users,
>>>
>>> A while ago, Deepayan Sarkar suggested some code that uses the group
>>> argument in bwplot to create some 'side-by-side' boxplots
>>> (https://stat.ethz.ch/pipermail/r-help/2010-February/230065.html). The
>>> example he gave was relatively specific and I wanted to generalize his
>>> approach into a function. Unfortunately, I seem to have some issues
>>> passing the correct arguments to the panel function, and would greatly
>>> appreciate any suggestions to solve these issues:
>>>
>>> require(lattice)
>>>
>>> mybwplot <- function(x,y,data,groups){
>>>
>>>  if (missing(groups)||is.null(groups)) {
>>>    groups <- NULL
>>>    ngroups <- 1
>>>  } else {
>>>    data[[groups]] <- as.factor(data[[groups]])
>>>    ngroups <- nlevels(data[[groups]])
>>>  }
>>>  mywidth <- 1/(ngroups+1)
>>>
>>>  mypanel <- function(x,y,groups,...){
>>>    if (missing(groups)||is.null(groups)) {
>>>      panel.bwplot(x,y,...)
>>>    } else {
>>>      panel.superpose(x,y,...)
>>>    }
>>>  }
>>>
>>>  mypanel.groups <- function(x,y,groups,ngroups,...){
>>>    if (missing(groups)||is.null(groups)){
>>>      NULL
>>>    } else {
>>>      function(x, y, ..., group.number) {
>>>        panel.bwplot(x+(group.number-0.5*(ngroups+1))/(ngroups+1),y, ...)}
>>>    }
>>>  }
>>>
>>>  bwplot(formula(paste(y,x,sep=' ~ ')),
>>>       data = data,
>>>       groups = 'Plant',
>>>       ngroups=ngroups,
>>>       pch = "|",
>>>       box.width = mywidth,
>>>       panel = mypanel,
>>>       panel.groups = mypanel.groups)
>>>
>>> }
>>>
>>> myCO2 <- CO2
>>> myCO2$year <- 2011
>>> summary(myCO2)
>>>
>>> mybwplot('Type','uptake',myCO2) # works
>>>
>>> mybwplot('Type','uptake',myCO2,'Treatment') # Error using packet 1,
>>> 'x' is missing
>>>
>>> mybwplot('Type','uptake',myCO2,'year') # Error using packet 1, 'x' is missing
>>>
>>> # Deepayan Sarkar suggested code (adapted to myC02)
>>> # bwplot(uptake ~ Plant, data = myCO2, groups = Treatment,
>>> #        pch = "|", box.width = 1/3,
>>> #        panel = panel.superpose,
>>> #        panel.groups = function(x, y, ..., group.number) {
>>> #            panel.bwplot(x + (group.number-1.5)/3, y, ...)
>>> #        })
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>



More information about the R-help mailing list