Hi:

Here's another approach: use apply to do the sampling inline. Using Carrie's
original problem,

apply(Z, 1, function(x) x[sample(1:length(x), 3)])
          [,1]       [,2]        [,3]      [,4]
[1,]  0.6236041 -0.7554920  0.58903794 0.8390664
[2,]  0.8291094  0.4041808  0.07874168 1.2790384
[3,] -0.2517490 -0.4839661 -1.64292091 0.5100849

[results vary due to different sampled indices, but the principle's the
same.]


system time is competitive: (user time? I have a Windows  box...enough said
:)

system.time(replicate(10000, apply(Z, 1, function(x) x[sample(1:length(x),
3)])))
   user  system elapsed
   3.21    0.00    3.90

However...
> Z1 <- matrix(rnorm(2000000), nrow = 5)
> system.time(apply(Z1, 1, function(x) x[sample(1:length(x), 3)]))
   user  system elapsed
   0.07    0.05    0.16
> Z1 <- matrix(rnorm(5000000), nrow = 20)
> system.time(apply(Z1, 1, function(x) x[sample(1:length(x), 10)]))
   user  system elapsed
   0.32    0.06    0.53
> system.time(apply(Z1, 1, function(x) x[sample(1:length(x), 5)]))
   user  system elapsed
   0.42    0.05    0.55
> system.time(apply(Z1, 1, function(x) x[sample(1:length(x), 3)]))
   user  system elapsed
   0.52    0.02    0.75

so it seems to operate pretty quickly in large matrices.

Aesthetically, I like Bert's approach the best. Matrix indexing is cool :)

FWIW,
Dennis

On Thu, Feb 4, 2010 at 8:53 PM, Carrie Li <carrieandstat@gmail.com> wrote:

> Thank you, David
> Here is an example :
>
>
> Z=matrix(rnorm(20), nrow=4)
> index=replicate(4, sample(1:5, 3))
> P=4
> tmpr=list()
> for (i in 1:P)
> {
>  tmp = Z[i,index[,i]]
>  tmpr[[i]]=tmp
> }
>
>
> So, I am trying to pull out the values in Z for each row, but now I only
> want to pull out the values indexed by the matrix "index"
> And, since I have large P, so I would like to avoid loop.
> Any quick way to do this ?
>
> Thanks again!!
>
> Carrie
>
>
>
>
>
>
> On Thu, Feb 4, 2010 at 10:39 PM, David Winsemius <dwinsemius@comcast.net
> >wrote:
>
> >
> > On Feb 4, 2010, at 9:51 PM, Carrie Li wrote:
> >
> >  Dear R-helpers ,
> >>
> >> I have a simple loop as follows, however, to be more efficient, I would
> >> like
> >> to use any apply functions (tapply, I suppose)
> >> But how can I do this ? I am not very clear about this.
> >>
> >> # Z is a P * Q matrix
> >> # so for each row of Z, I would like to pull out only some of the
> >> elements,
> >> and save as a separate matrix under a list
> >> # index is a vector with length smaller than Q, but the index could be
> >> different for each row of Z.
> >>
> >
> > An example would help. Sounds like you need a list structure to hold the
> > index and I don't see that you have constructed one.
> >
> >
> >> for (i in 1:P)
> >> {
> >>  tmp = matrix(Z[i, index], nrow=1)
> >>
> >
> > Seems as though you would need to "index" in a verb sense (with "i") the
> > index (in a noun sense)  structure. Might be better to call it "idx".
> > Perhaos
> >
> > tmp = matrix(Z[i, index[[i]] ], nrow=1)  # the nrow=1 appears superfluous
> >
> >
> >   tmpr[[i]]=tmp
> >> }
> >>
> >>
> >  any help is highly appreciated!!
> >>
> >> Thank you all
> >>
> >> Carrie
> >>
> >>        [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help@r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guide
> >> http://www.R-project.org/posting-guide.html
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> > David Winsemius, MD
> > Heritage Laboratories
> > West Hartford, CT
> >
> >
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]

