[R] sweep() and recycling
Heather Turner
Heather.Turner at warwick.ac.uk
Mon Jun 20 15:01:07 CEST 2005
Dr H Turner
Research Assistant
Dept. of Statistics
The University of Warwick
Coventry
CV4 7AL
Tel: 024 76575870
>>> Robin Hankin <r.hankin at noc.soton.ac.uk> 06/20/05 10:32am >>>
Hi
I had a hard-to-find bug in some of my code the other day, which I
eventually
traced to my misusing of sweep().
I would expect sweep() to give
me a warning if the elements don't recycle nicely, but
X <- matrix(1:36,6,6)
sweep(X,1,1:5,"+")
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 9 16 23 30 32
[2,] 4 11 18 25 27 34
[3,] 6 13 20 22 29 36
[4,] 8 15 17 24 31 38
[5,] 10 12 19 26 33 40
[6,] 7 14 21 28 35 37
gives no warning, even though (5,36)=1.
Also,
sweep(X,1,c(1,1000),"+")
and
sweep(X,2,c(1,1000),"+")
behave as expected, But
sweep(X,1,1:5,"+")
and
sweep(X,2,1:5,"+")
are identical!
...which is also expected since the matrix is square. Perhaps the
following will help you see why:
> matrix(1:5,6,6)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 1
[2,] 2 3 4 5 1 2
[3,] 3 4 5 1 2 3
[4,] 4 5 1 2 3 4
[5,] 5 1 2 3 4 5
[6,] 1 2 3 4 5 1
Warning message:
data length [5] is not a sub-multiple or multiple of the number of rows
[6] in matrix
> matrix(1:5,6,6, byrow = TRUE)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 1
[2,] 2 3 4 5 1 2
[3,] 3 4 5 1 2 3
[4,] 4 5 1 2 3 4
[5,] 5 1 2 3 4 5
[6,] 1 2 3 4 5 1
Warning message:
data length [5] is not a sub-multiple or multiple of the number of rows
[6] in matrix
i.e. recycling a vector of length 5 down the columns gives the same
result as recycling the same vector along the rows.
I agree with your main point however, it would be useful if 'sweep'
would give a warning when the length of the vector of statistics to be
swept out was not a sub-multiple or multiple of the corresponding array
dimension.
Heather
More information about the R-help
mailing list