Hi expeRts,
I would like to calculate weighted mean by two factors.
My code is as follows:
R> tmp <- by(re$meta.sales.lkm[, c("pc", "sales")],
re$meta.sales.lkm[, c("size", "yr")],
function(x)
weighted.mean(x[,1], x[,2]))
The result is as follows:
R> tmp
size: micro
yr: 1994
[1] 1.090
------------------------------------------------------------
size: small
yr: 1994
[1] 1.135
------------------------------------------------------------
size: medium
yr: 1994
[1] 1.113
------------------------------------------------------------
size: large
yr: 1994
[1] 1.105
------------------------------------------------------------
size: micro
yr: 1995
[1] 1.167
------------------------------------------------------------
size: small
yr: 1995
[1] 1.096
------------------------------------------------------------
size: medium
yr: 1995
[1] 1.056
....
....
But the form I want to get is as follows:
1994 1995 1996 .....
micro 1.090 1.167 .............
small 1.135 1.096
medium 1.113 1.056 .... ........
large 1.105 ....... ...........
That is, the result should be tabularized.
How can I get the above form directly? (I don't want to modify tmp with
as.vector() and matrix() to get the result)
Thank you in advance.
--------------------------------------------------------------------------
Donghyun Oh
CESIS, KTH
--------------------------------------------------------------------------
[[alternative HTML version deleted]]
Sounds like a job for plyr: http://had.co.nz/plyr On Mon, Apr 13, 2009 at 7:56 PM, Dong H. Oh <r.arecibo at gmail.com> wrote:> Hi expeRts, > > I would like to calculate weighted mean by two factors. > > My code is as follows: > > R> tmp <- by(re$meta.sales.lkm[, c("pc", "sales")], > ? ? ? ? ? ? ? ? ? ? ?re$meta.sales.lkm[, c("size", "yr")], function(x) > ? ? ? ? ? ? ? ? ? ? ?weighted.mean(x[,1], x[,2])) > > The result is as follows: > R> tmp > size: micro > yr: 1994 > [1] 1.090 > ------------------------------------------------------------ > size: small > yr: 1994 > [1] 1.135 > ------------------------------------------------------------ > size: medium > yr: 1994 > [1] 1.113 > ------------------------------------------------------------ > size: large > yr: 1994 > [1] 1.105 > ------------------------------------------------------------ > size: micro > yr: 1995 > [1] 1.167 > ------------------------------------------------------------ > size: small > yr: 1995 > [1] 1.096 > ------------------------------------------------------------ > size: medium > yr: 1995 > [1] 1.056 > .... > .... > > But the form I want to get is as follows: > ? ? ? ? ? ?1994 ? ? ? 1995 ? ? ? ? 1996 ? ? ?..... > micro ? ?1.090 ? ? ?1.167 ? ? ? ? ............. > small ? ? 1.135 ? ? ?1.096 > medium 1.113 ? ? ?1.056 ? ? ? ?.... ........ > large ? ? ?1.105 ? ? ?....... ........... > > That is, the result should be tabularized. > How can I get the above form directly? (I don't want to modify tmp with > as.vector() and matrix() to get the result) > > Thank ?you in advance. > > -------------------------------------------------------------------------- > Donghyun Oh > CESIS, KTH > -------------------------------------------------------------------------- > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > 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. >-- Mike Lawrence Graduate Student Department of Psychology Dalhousie University Looking to arrange a meeting? Check my public calendar: http://tr.im/mikes_public_calendar ~ Certainty is folly... I think. ~
Note that that output of by() is a matrix, but with some extra
attributes added to it.
Since you didn't supply any data I made up some that might
resemble yours.
> set.seed(1)
> re<-list(meta.sales.lkm=data.frame(pc=runif(40), sales=rpois(40,3),
size=sample(c("small","medium","large"),size=40,replace=TRUE),
yr=sample(1994:1998,size=40,replace=TRUE)))
I ran your by() call
> tmp<-by(re$meta.sales.lkm[, c("pc", "sales")],
re$meta.sales.lkm[, c("size", "yr")],
function(x) weighted.mean(x[,1], x[,2]))
and looked at it with dput and saw that all the usual
components of a matrix are in it
> dput(tmp)
structure(c(0.86969084572047, 0.687022846657783, 0.40032217082464,
0.125555095961317, 0.529131081343318, 0.64538708513137,
0.613078526553831,
0.663822646145351, 0.48206098045921, 0.333916208640273,
0.513083046752339,
NA, 0.457996427547187, 0.30292882991489, NA), .Dim = c(3L, 5L
), .Dimnames = structure(list(size = c("large", "medium",
"small"
), yr = c("1994", "1995", "1996",
"1997", "1998")), .Names c("size",
"yr")), call = by.data.frame(data = re$meta.sales.lkm[,
c("pc",
"sales")], INDICES = re$meta.sales.lkm[, c("size",
"yr")],
FUN = function(x) weighted.mean(x[, 1], x[, 2])), class = "by")
It is just the print method for 'by' objects that makes it look
different.
Since there is no special 'by' method for '[' you can use tmp[,]
to view
the matrix part of it
> tmp[,]
yr
size 1994 1995 1996 1997 1998
large 0.8696908 0.1255551 0.6130785 0.3339162 0.4579964
medium 0.6870228 0.5291311 0.6638226 0.5130830 0.3029288
small 0.4003222 0.6453871 0.4820610 NA NA
If there were a [.by then you might have to manually remove the
"call" attribute and change the class to "matrix".
Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com
---------------------------------------
R] weighted mean and by() with two index
Dong H. Oh r.arecibo at gmail.com
Tue Apr 14 00:56:28 CEST 2009
Hi expeRts,
I would like to calculate weighted mean by two factors.
My code is as follows:
R> tmp <- by(re$meta.sales.lkm[, c("pc", "sales")],
re$meta.sales.lkm[, c("size", "yr")],
function(x)
weighted.mean(x[,1], x[,2]))
The result is as follows:
R> tmp
size: micro
yr: 1994
[1] 1.090
------------------------------------------------------------
size: small
yr: 1994
[1] 1.135
------------------------------------------------------------
size: medium
yr: 1994
[1] 1.113
------------------------------------------------------------
size: large
yr: 1994
[1] 1.105
------------------------------------------------------------
size: micro
yr: 1995
[1] 1.167
------------------------------------------------------------
size: small
yr: 1995
[1] 1.096
------------------------------------------------------------
size: medium
yr: 1995
[1] 1.056
....
....
But the form I want to get is as follows:
1994 1995 1996 .....
micro 1.090 1.167 .............
small 1.135 1.096
medium 1.113 1.056 .... ........
large 1.105 ....... ...........
That is, the result should be tabularized.
How can I get the above form directly? (I don't want to modify tmp with
as.vector() and matrix() to get the result)
Thank you in advance.
------------------------------------------------------------------------
--
Donghyun Oh
CESIS, KTH
------------------------------------------------------------------------
--
[[alternative HTML version deleted]]