[R-br] Ajuda para evitar um loop com elegância (agora correto)
Benilton Carvalho
beniltoncarvalho em gmail.com
Sábado Abril 14 09:07:24 BRT 2012
Ah... e, nao tao eficaz como minha sugestao inicial (ha' mudancas
dentro de f e g que podem tornar o codigo mais rapido), mas apenas
para registro, vc pode usar modelos lineares para isso:
f = function(m){
y <- as.numeric(m)
f1 <- factor(col(m))
f2 <- factor(row(m))
matrix(residuals(lm(y~f1+f2)), nc=3)
}
g <- function(m){
y <- as.numeric(m)
X <- model.matrix(~factor(col(m))+factor(row(m)))
b <- solve(crossprod(X), crossprod(X, y))
matrix(y-X%*%b, nc=3)
}
ref <- function(m){
mg = mean(m)
mr = rowMeans(m)
mc = colMeans(m)
sweep(sweep(m, 1, mr), 2, mc)+mg
}
set.seed(1)
m <- matrix(runif(24), ncol=3)
system.time(r0 <- f(m))
system.time(r1 <- g(m))
system.time(refRes <- ref(m))
all.equal(r0, r1)
all.equal(r0, refRes)
b
2012/4/14 Benilton Carvalho <beniltoncarvalho em gmail.com>:
> sweep(sweep(m, 1, mr), 2, mc)+mg
Mais detalhes sobre a lista de discussão R-br