[R] How to unstack three columns into rows?

David Winsemius
Tue, 27 May 2014 23:15:53 -0000

On May 27, 2014, at 3:54 AM, Kristi Glover wrote:

>
> data<-structure(list(siteS = structure(c(3L, 3L, 3L, 4L, 4L, 5L, 5L,
> 5L, 5L, 5L, 1L, 1L, 1L, 2L), .Label = c("11a", "12d",
"1a", "2v",
> "6a"), class = "factor"), species = structure(c(1L, 2L,
3L, 1L,
> 4L, 1L, 4L, 5L, 2L, 3L, 1L, 6L, 3L, 1L), .Label = c("sa",
"sb",
> "sc", "sd", "se", "sg"), class =
"factor"), abundance = c(31L,
> 55L, 62L, 42L, 40L, 30L, 84L, 10L, 23L, 74L, 11L, 51L, 37L, 15L
> )), .Names = c("siteS", "species",
"abundance"), class = "data.frame", row.names = c(NA,
> -14L))
>
> I wanted to have this data into following format
>
> newData<-structure(list(siteS = structure(c(3L, 4L, 5L, 1L, 2L), .Label
= c("11a",
> "12d", "1a", "2v", "6a"), class =
"factor"), sa = c(31L, 42L,
> 30L, 11L, 15L), sb = c(55L, NA, 84L, NA, NA), sc = c(62L, NA,
> 10L, 37L, NA), sd = c(NA, 40L, 23L, NA, NA), se = c(NA, NA, 74L,
> NA, NA), sg = c(NA, NA, NA, 51L, NA)), .Names = c("siteS",
"sa",
> "sb", "sc", "sd", "se",
"sg"), class = "data.frame", row.names = c(NA,
> -5L))

> xtdat <- xtabs( abundance ~ siteS + species, data)

# Zeros rather than NA

> require(gtools)   # for mixedsort()
Loading required package: gtools

> xtdat2 <- xtdat[ mixedsort(dimnames(xtdat)[[1]]) ,]
> is.na(xtdat2) <- xtdat2==0
> xtdat2
     species
siteS sa sb sc sd se sg
  1a  31 55 62 NA NA NA
  2v  42 NA NA 40 NA NA
  6a  30 23 74 84 10 NA
  11a 11 NA 37 NA NA 51
  12d 15 NA NA NA NA NA

--


David Winsemius
Alameda, CA, USA