[R] How to Reshuffle a distance object

Sarah Goslee sarah.goslee at gmail.com
Wed Apr 15 16:22:34 CEST 2009


You don't say what your intent is, but for most applications it's
important to preserve the pairwise matches. Here's one way
to do that.

library(ecodist) # for the convenient functions lower() and full()
library(ade4)
x1 <- c(rep(0,4),1)
x2 <- c(rep(0,2),rep(1,3))
x3 <- c(rep(1,3), rep(0,2))
X <- as.data.frame(rbind(x1, x2, x3))
jc.dist  <- dist.binary(X, method=1)

jc.full <- full(jc.dist)
dim(jc.full) # 3 x 3
randsample <- sample(1:nrow(jc.full))
jc.randfull <- jc.full[randsample, randsample]
jc.randdist <- lower(jc.randfull)

# if it needs to be of class dist
attributes(jc.randdist) <- attributes(jc.dist)

If just putting the distances in a random order is really all right for
your application, you can skip everything except the last step.
jc.new <- sample(jc.dist)
attributes(jc.new) <- attributes(jc.dist)

Sarah

On Wed, Apr 15, 2009 at 10:02 AM, Dale Steele <dale.w.steele at gmail.com> wrote:
> I would like to randomly shuffle a distance object, such as the one
> created by ade4{dist.binary} below. My first attempt, using
> sample(jc.dist) creates a shuffled vector, losing the lower triangular
> structure of the distance object.  How can I Ishuffle the lower
> triangular part of a distance matrix without losing the structure?
> Thanks.  --Dale
>
> x1 <- c(rep(0,4),1)
> x2 <- c(rep(0,2),rep(1,3))
> x3 <- c(rep(1,3), rep(0,2))
> X <- rbind(x1,x2,x3)
> X
> X <- as.data.frame(X)
> library(ade4)
> jc.dist  <- dist.binary(X, method=1)
> sample(jc.dist)
>



-- 
Sarah Goslee
http://www.functionaldiversity.org




More information about the R-help mailing list