Hi
Given three vectors
x <- c(fish=3, dogs=5, bats=2)
y <- c(dogs=1, hogs=3)
z <- c(bats=3, dogs=5)
How do I create a multi-way table like the following?
> out
x y z
bats 2 0 3
dogs 5 1 5
fish 3 0 0
hogs 0 3 0
('out' is a matrix).
See how the first line shows 'x' has 2 bats, 'y' has zero bats,
and 'z'
has 3 bats
and so on for each line.
The real application would have a matrix of size ~10 by ~10000.
--
Robin K. S. Hankin
Uncertainty Analyst
University of Cambridge
19 Silver Street
Cambridge CB3 9EP
01223-764877
Try this: Reduce(function(...)merge(..., by = 'ind', all = TRUE), lapply(list(x, y, z), stack)) On Fri, Jul 30, 2010 at 10:39 AM, Robin Hankin <rksh1@cam.ac.uk> wrote:> Hi > > Given three vectors > > x <- c(fish=3, dogs=5, bats=2) > y <- c(dogs=1, hogs=3) > z <- c(bats=3, dogs=5) > > How do I create a multi-way table like the following? > > > out > x y z > bats 2 0 3 > dogs 5 1 5 > fish 3 0 0 > hogs 0 3 0 > > ('out' is a matrix). > > See how the first line shows 'x' has 2 bats, 'y' has zero bats, and 'z' has > 3 bats > and so on for each line. > The real application would have a matrix of size ~10 by ~10000. > > > > > -- > Robin K. S. Hankin > Uncertainty Analyst > University of Cambridge > 19 Silver Street > Cambridge CB3 9EP > 01223-764877 > > ______________________________________________ > R-help@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. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]
Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Robin Hankin > Sent: Friday, July 30, 2010 6:40 AM > To: r-help at r-project.org > Subject: [R] simple table/matrix problem > > Hi > > Given three vectors > > x <- c(fish=3, dogs=5, bats=2) > y <- c(dogs=1, hogs=3) > z <- c(bats=3, dogs=5) > > How do I create a multi-way table like the following? > > > out > x y z > bats 2 0 3 > dogs 5 1 5 > fish 3 0 0 > hogs 0 3 0You could try using a matrix subscript to a matrix to insert the values, as in: f <- function (dataList) { animals <- sort(unique(a <- unlist(lapply(dataList, names), use.names = FALSE))) variables <- names(dataList) retval <- array(0, dim = c(length(animals), length(variables)), dimnames = list(animals, variables)) retval[cbind(match(a, animals), rep(seq_along(dataList), vapply(dataList, length, integer(1))))] <- unlist(dataList, use.names = FALSE) retval }> f(list(x=x,y=y,z=z))x y z bats 2 0 3 dogs 5 1 5 fish 3 0 0 hogs 0 3 0 Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> > ('out' is a matrix). > > See how the first line shows 'x' has 2 bats, 'y' has zero > bats, and 'z' > has 3 bats > and so on for each line. > The real application would have a matrix of size ~10 by ~10000. > > > > > -- > Robin K. S. Hankin > Uncertainty Analyst > University of Cambridge > 19 Silver Street > Cambridge CB3 9EP > 01223-764877 > > ______________________________________________ > 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. >
Hadley Wickham's reshape package makes tasks like these pretty easy. http://cran.r-project.org/web/packages/reshape/index.html -- View this message in context: http://r.789695.n4.nabble.com/simple-table-matrix-problem-tp2307969p2308713.html Sent from the R help mailing list archive at Nabble.com.