[R] Reshaping a dataframe with conditional summary of columns - apply or reshape?

Henrique Dallazuanna wwwhsd at gmail.com
Thu Jan 24 19:51:26 CET 2008


Try this:

x$survey1[x$count==0] <- 0
x$survey1[x$count %in% 1:11] <- 1
x$survey1[x$count > 11] <- 2
 x.wide <- reshape(x, v.names="survey1", idvar="location",
timevar="survey1", direction="wide")
x.wide <- x.wide[order(x.wide$location),]
x.wide$var1 <- tapply(x$var1, x$location, mean)
x.wide



On 24/01/2008, Dave Hewitt <dhewitt at vims.edu> wrote:
> I need to do a somewhat complex rearrangement of an existing dataframe that
> involves an "on-the-fly" conditional summary as well. I've tried to make
> the example as simple as possible. Code to produce the object being acted
> on is at the end of the message. I hope this isn't too much for a single
> posting. Any guidance will be much appreciated.
>
> The input example looks like this:
>
> survey  year    count   location        var1    var2
> 1       1       2       A1      21.2    1
> 2       1       0       A1      15.6    1
> 3       1       29      A1      12.1    1
> 1       1       11      B3      9       2
> 3       1       5       B3      4.8     2
> 1       2       7       A2      20.1    4
> 2       2       2       A2      19.2    4
>
> I need to rearrange it to look like this (the order of the columns is not
> important):
>
> location        year    survey1 survey2 survey3 var1summ        var2
> A1      1       1       0       2       16.3    1
> B3      1       2       NA      1       6.9     2
> A2      2       1       1       NA      19.7    4
>
> The operations/conditions that I need are:
>
> (A) The observations in "count" for each survey at each location in a given
> year need to be reduced according to the following rules and then placed in
> new columns "survey1", "survey2", "survey3" :
> -- when  count = 0,  surveyX = 0
> -- when  0 < count < 11,  surveyX = 1
> -- when  11 < count,  surveyX = 2
>
> (B) The observations in var1 need to be summarized (here, by taking the
> mean) across all surveys for a given location in a given year and placed in
> "var1summ"
>
> (C) Observations in var2 need to be summarized in a similar way, except
> that they don't change across surveys for a given location in a given year
> (so mean, median, etc. would work, but a more general solution would be
> nice for variables that are categorical)
>
> (D) Surveys (rows) can be missing for a given location in a given year. I'd
> like to retain a column for each survey in the new dataframe and denote
> surveys that were missing as NA. E.g., survey2 is missing for location B3
> in year 1.
>
>
> ** Object creation:
> x <- structure(list(survey = c(1L, 2L, 3L, 1L, 3L, 1L, 2L), year = c(1L,
> 1L, 1L, 1L, 1L, 2L, 2L), count = c(2L, 0L, 29L, 11L, 5L, 7L, 2L), location
> = structure(c(1L, 1L, 1L, 3L, 3L, 2L, 2L), .Label = c("A1", "A2", "B3"),
> class = "factor"), var1 = c(21.2, 15.6, 12.1, 9, 4.8, 20.1, 19.2), var2 =
> c(1L, 1L, 1L, 2L, 2L, 4L, 4L)), .Names = c("survey", "year", "count",
> "location", "var1", "var2"), class = "data.frame", row.names = c(NA, -7L))
>
> Thanks,
> Dave Hewitt
> Fisheries Science
> Virginia Institute of Marine Science, Gloucester Point, VA, USA
>
> ______________________________________________
> 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.
>


-- 
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O



More information about the R-help mailing list