(sorry if the title is not very informative: I don't know how to define better this question)
I have my data in the following form:

In each group I have one pre value and one or two post values. I would like to convert this table to the following:

I was thinking to group the data with something like:
aggregate(mydata, by = group, FUN = myfunction)
or
ddply(mydata, .(group), .fun = myfunction)
and process the elements of each group in my function. But I don't see how to do this because I need to pass both type and value to my function simultaneously. Is there a better way to do this?
Update: quick-and-dirty sample dataset:
mydata <- data.frame(group = sample(letters[1:5], 10, replace = TRUE), 
                     type = sample(c("pre", "post"), 10, replace = TRUE), 
                     value = rnorm(10))
                Try something like this:
mydf <- data.frame(group = c("A", "A", "B", "B",
                             "C", "C", "C", "D",
                             "D", "E", "E"),
                   type = c("pre", "post", "pre",
                            "post", "pre", "post",
                            "post", "pre", "post",
                            "pre", "post"),
                   value = 1:11)
times <- with(mydf, ave(value, group, type, FUN = seq_along))
xtabs(value ~ group + interaction(type, times), mydf)
#      interaction(type, times)
# group post.1 pre.1 post.2 pre.2
#     A      2     1      0     0
#     B      4     3      0     0
#     C      6     5      7     0
#     D      9     8      0     0
#     E     11    10      0     0
Or:
times <- with(mydf, ave(value, group, type, FUN = seq_along))  
mydf$timevar <- interaction(mydf$type, times)
reshape(mydf, direction = "wide", idvar = "group", 
        timevar="timevar", drop="type")
#    group value.pre.1 value.post.1 value.post.2
# 1      A           1            2           NA
# 3      B           3            4           NA
# 5      C           5            6            7
# 8      D           8            9           NA
# 10     E          10           11           NA
The key, in both solutions, is to create a "time" variable that is represented by the combination of "type" and a sequence variable that can be created with ave.
For completeness, here's dcast from "reshape2":
times <- with(mydf, ave(value, group, type, FUN = seq_along))
library(reshape2)
dcast(mydf, group ~ type + times)
#   group post_1 post_2 pre_1
# 1     A      2     NA     1
# 2     B      4     NA     3
# 3     C      6      7     5
# 4     D      9     NA     8
# 5     E     11     NA    10
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With