[R] melting a list: basic question

baptiste auguie ba208 at exeter.ac.uk
Sat Jul 26 11:43:15 CEST 2008



On 26 Jul 2008, at 02:52, hadley wickham wrote:

> On Fri, Jul 25, 2008 at 8:50 PM, hadley wickham  
> <h.wickham at gmail.com> wrote:
>> On Fri, Jul 25, 2008 at 9:49 AM, baptiste auguie  
>> <ba208 at exeter.ac.uk> wrote:
>>> Dear list,
>>>
>>>
>>> I'm trying to use the reshape package to perform a merging  
>>> operation on a
>>> list of data.frames as illustrated below,
>>>
>>>> a <- 1:10
>>>> example <- list( data.frame(a=a, b=sin(a)),  data.frame(a=a,  
>>>> b=cos(a)) )
>>>>
>>>> melt(example, id = a)
>>
>> You want:
>>
>> melt(example, id = "a")
>>
>> i.e. the id argument is a character or numeric vector specifying  
>> which
>> variables to use as id variables.  Your call would be equivalent to
>>
>> melt(example, id = 1:10)
>>
>> which clearly is incorrect for your example.


Sorry about the poor example, I hadn't realized it worked only thanks  
to the default behavior.


> I've just noticed that there's also a bug in the released version
> (fixed in my development version) which means that the id argument to
> melt.list() is not being passed on to the individual
> melt.data.frame()s
>

Considering the following example, this makes sense:

> a <- as.numeric(1:10)
>
> example <- list(data.frame(a=a, b=sin(a)), data.frame(a=a, b=cos(a)))
>
> melt(example, id = "a") # this does not use a as an id variable
>
> melt(example[[1]], id = "a") # the method for the individual  
> data.frame works fine

Is it possible to install your development version of reshape? I could  
not find it alongside of ggplot2 on github. If not, I've added "..."  
in the method for the current version and it seems to work for me.

> melt.list <- function(data, ..., level=1) {
> 	var <- nulldefault(attr(data, "varname"), paste("L", level, sep=""))
> 	names <- nulldefault(names(data), 1:length(data))
> 	parts <- lapply(data, melt, level=level+1, ...)
> 	
> 	namedparts <- mapply(function(x, name) {
> 	 x[[var]] <- name
> 	 x
> 	}, parts, names, SIMPLIFY=FALSE)
> 	do.call(rbind.fill, namedparts)
> }

Many thanks,

baptiste



More information about the R-help mailing list