[R] Getting rid of loops?
Peter Dalgaard
p.dalgaard at biostat.ku.dk
Wed Dec 3 00:57:46 CET 2003
Simon.Gatehouse at csiro.au writes:
> I think this will do what you want, though there may be ways of speeding it
> up further.
>
> theta.dist <- function(x)
> as.dist(acos(crossprod(t(x))/sqrt(crossprod(t(rowSums(x*x)))))/pi*180)
Or,
theta.dist <- function(x)
as.dist(acos(cov2cor(crossprod(t(x))))/pi*180)
Now, if only there was a way to tell cor() not to center the
variables, we'd have
as.dist(acos(cor(t(x),center=F))/pi*180)
Unfortunately there's no such argument.
>
> theta.dist <- function(x){
>
> res <- matrix(NA, nrow(x), nrow(x))
>
> for (i in 1:nrow(x)){
> for(j in 1:nrow(x)){
> if (i > j)
> res[i, j] <- res[j, i]
> else {
> v1 <- x[i,]
> v2 <- x[j,]
> good <- !is.na(v1) & !is.na(v2)
> v1 <- v1[good]
> v2 <- v2[good]
> theta <- acos(v1%*%v2 / sqrt(v1%*%v1 * v2%*%v2 )) / pi * 180
> res[i,j] <- theta
> }
> }
> }
> as.dist(res)
> }
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> <https://www.stat.math.ethz.ch/mailman/listinfo/r-help>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>
--
O__ ---- Peter Dalgaard Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics 2200 Cph. N
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
More information about the R-help
mailing list