[R] Creating 3 vectors that sum to 1

Peter Ehlers ehlers at ucalgary.ca
Tue Mar 29 19:05:10 CEST 2011


On 2011-03-29 09:20, Christopher Desjardins wrote:
> I have 3 vectors: p1, p2, and p3. I would like each vector to be any
> possible value between 0 and 1 and p1 + p2 + p3 = 1. I want to graph these
> and I've thought about using scatterplot3d(). Here's what I have so far.
>
> library(scatterplot3d)
> p1<- c(1,0,0,.5,.5,0,.5,.25,.25,.34,.33,.33,.8,.1,.1,.9,.05,.05)
> p2<- c(0,1,0,.5,0,.5,.25,.5,.25,.33,.34,.33,.1,.8,.1,.05,.9,.05)
> p3<- c(0,0,1,0,.5,.5,.25,.25,.5,.33,.33,.34,.1,.1,.8,.05,.05,.9)
> scatterplot3d(p1,p2,p3)
>
>
> However, I wonder if there is an easy way to create vectors p1, p2, and p3.

If all you want is a set of 3 vectors summing to 1, you could
generate 3 vectors with runif() and then scale them:

  n <- 10
  u <- runif(3*n)
  m <- matrix(u, nr=3)
  m1 <- apply(m, 2, function(x) x/sum(x))
      ## or use: m1 <- sweep(m, 2, colSums(m), "/")
  colSums(m1)
  #[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Peter Ehlers



More information about the R-help mailing list