#  Listing 5.5 - Applying a function to the rows (columns) of a matrix
mydata <- matrix(rnorm(30), nrow=6)
mydata
##            [,1]       [,2]       [,3]       [,4]        [,5]
## [1,]  1.1563411  0.4529675 -0.3742989 -1.1368348 -0.04450578
## [2,] -0.3488814 -1.0026456 -1.0046681  0.1461440 -0.23045932
## [3,]  0.4066966 -1.0659231  2.0466784  1.0539497  0.64792481
## [4,]  1.0534227  0.6718130 -0.3419998 -0.8710148 -1.49782960
## [5,]  0.9517214 -1.7525048  0.2147496  0.9762821  0.73149692
## [6,]  1.3885672  1.9919665  0.9262151  0.8263843  0.44048237
apply(mydata, 1, mean)     
## [1]  0.01073383 -0.48810210  0.61786529 -0.19712171  0.22434905  1.11472309
apply(mydata, 2, mean) 
## [1]  0.767977933 -0.117387757  0.244446065  0.165818406  0.007851565
apply(mydata, 2, mean, trim=.2) # Uses 60% of data
## [1]  0.8920455 -0.2359470  0.1061665  0.2694489  0.2033605
# Listing 5.10 - Aggregating data
options(digits=3)
attach(mtcars)
aggdata <-aggregate(mtcars, by=list(cyl,gear), 
                    FUN=mean, na.rm=TRUE)
aggdata
##   Group.1 Group.2  mpg cyl disp  hp drat   wt qsec  vs   am gear carb
## 1       4       3 21.5   4  120  97 3.70 2.46 20.0 1.0 0.00    3 1.00
## 2       6       3 19.8   6  242 108 2.92 3.34 19.8 1.0 0.00    3 1.00
## 3       8       3 15.1   8  358 194 3.12 4.10 17.1 0.0 0.00    3 3.08
## 4       4       4 26.9   4  103  76 4.11 2.38 19.6 1.0 0.75    4 1.50
## 5       6       4 19.8   6  164 116 3.91 3.09 17.7 0.5 0.50    4 4.00
## 6       4       5 28.2   4  108 102 4.10 1.83 16.8 0.5 1.00    5 2.00
## 7       6       5 19.7   6  145 175 3.62 2.77 15.5 0.0 1.00    5 6.00
## 8       8       5 15.4   8  326 300 3.88 3.37 14.6 0.0 1.00    5 6.00
# Using the reshape2 package
library(reshape2)

# input data
mydata <- read.table(header=TRUE, sep="", text="
                     ID Time X1 X2
                     1 1 5 6
                     1 2 3 5
                     2 1 6 1
                     2 2 2 4
                     ")

# melt data
md <- melt(mydata, id=c("ID", "Time"))

# reshaping with aggregation
dcast(md, ID~variable, mean)
##   ID X1  X2
## 1  1  4 5.5
## 2  2  4 2.5
dcast(md, Time~variable, mean)
##   Time  X1  X2
## 1    1 5.5 3.5
## 2    2 2.5 4.5
dcast(md, ID~Time, mean)
##   ID   1 2
## 1  1 5.5 4
## 2  2 3.5 3
# reshaping without aggregation
dcast(md, ID+Time~variable)
##   ID Time X1 X2
## 1  1    1  5  6
## 2  1    2  3  5
## 3  2    1  6  1
## 4  2    2  2  4
dcast(md, ID+variable~Time)
##   ID variable 1 2
## 1  1       X1 5 3
## 2  1       X2 6 5
## 3  2       X1 6 2
## 4  2       X2 1 4
dcast(md, ID~variable+Time)
##   ID X1_1 X1_2 X2_1 X2_2
## 1  1    5    3    6    5
## 2  2    6    2    1    4