[R] Error in rep.int() invalid 'times' value

Maram SAlem marammagdysalem at gmail.com
Tue Oct 20 18:32:33 CEST 2015


Yes Indeed William. f1() works perfectly well and took only 30 secs to
execute f1(25,15), but I wonder if there is anyway to speed up the
execution of the rest of my code (almost seven hours now) ?

Thanks for helping.

Maram Salem

On 20 October 2015 at 18:11, William Dunlap <wdunlap at tibco.com> wrote:

> f0 is essentially your original code put into a function, so
> expect it to fail in the same way your original code did.
> f1 should give the same answer as f0, but it should use
> less memory and time.
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
>
> On Tue, Oct 20, 2015 at 2:05 AM, Maram SAlem <marammagdysalem at gmail.com>
> wrote:
> > Thanks William. I've tried the first code, ( with f0() ), but still for
> > n=25, m=15 , I got this:
> >
> >> s<-f0(25,15)
> > Error in rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
> >   invalid 'times' value
> > In addition: Warning message:
> > In rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
> >   NAs introduced by coercion to integer range
> >
> >
> > I don't know if this is related to the memory limits of my laptop, or it
> > doesn't have to do with the memory.
> >
> > Any help on how to fix this error will be greatly appreciated.
> >
> > Thanks All.
> >
> > Maram Salem
> >
> > On 15 October 2015 at 17:52, William Dunlap <wdunlap at tibco.com> wrote:
> >>
> >> Doing enumerative combinatorics with rejection methods rarely
> >> works well. Try mapping your problem to the problem of choosing
> >> m-1 items from n-1.  E.g., your code was
> >>
> >> f0 <- function(n, m) {
> >>    stopifnot(n > m)
> >>    D<-matrix(0,nrow=n-m+1,ncol=m-1)
> >>    for (i in 1:m-1){
> >>       D[,i]<-seq(0,n-m,1)
> >>    }
> >>    ED <- do.call(`expand.grid`,as.data.frame(D))
> >>    ED<-unname(as.matrix(ED))
> >>    lk<-which(rowSums(ED)<=(n-m))
> >>    ED[lk,]
> >> }
> >>
> >> and I think the following does the same thing in much less space by
> >> transforming the output of combn().
> >>
> >> f1 <- function(n, m) {
> >>    stopifnot(n > m)
> >>    r0 <- t(diff(combn(n-1, m-1)) - 1L)
> >>    r1 <- rep(seq(from=0, len=n-m+1), choose( seq(to=m-2, by=-1,
> >> len=n-m+1), m-2))
> >>    cbind(r0[, ncol(r0):1, drop=FALSE], r1, deparse.level=0)
> >> }
> >>
> >> The code for adding the last column is a bit clumsy and could probably
> be
> >> improved.  Both f0 and f1 could also be cleaned up to work for m<=2.
> >>
> >> See Feller vol. 1 or Benjamin's "Proofs that (really) count" for more on
> >> this sort of thing.
> >>
> >>
> >>
> >> Bill Dunlap
> >> TIBCO Software
> >> wdunlap tibco.com
> >>
> >> On Thu, Oct 15, 2015 at 7:45 AM, Maram SAlem <marammagdysalem at gmail.com
> >
> >> wrote:
> >>>
> >>> Dear All,
> >>>
> >>> I'm trying to do a simple task (which is in fact a tiny part of a
> larger
> >>> code).
> >>>
> >>> I want to create a matrix, D, each of its columns is a sequence from 0
> to
> >>> (n-m), by 1. Then, using D, I want to create another matrix ED, whose
> >>> rows
> >>> represent all the possible combinations of the elements of the columns
> of
> >>> D. Then from ED, I'll select only the rows whose sum is less than or
> >>> equal
> >>> to (n-m), which will be called the matrix s. I used the following code:
> >>>
> >>> > n=5
> >>> > m=3
> >>> > D<-matrix(0,nrow=n-m+1,ncol=m-1)
> >>> > for (i in 1:m-1)
> >>> +  {
> >>> + D[,i]<-seq(0,n-m,1)
> >>> +  }
> >>> > ED <- do.call(`expand.grid`,as.data.frame(D))
> >>> > ED<-as.matrix(ED)
> >>>
> >>> > lk<-which(rowSums(ED)<=(n-m))
> >>>
> >>> > s<-ED[lk,]
> >>>
> >>>
> >>> This works perfectly well. But for rather larger values of n and m
> (which
> >>> are not so large actually), the number of all possible combinations of
> >>> the
> >>> columns of D gets extremely large giving me this error (for n=25,
> m=15):
> >>>
> >>> > ED <- do.call(`expand.grid`,as.data.frame(D))
> >>> Error in rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
> >>>   invalid 'times' value
> >>> In addition: Warning message:
> >>> In rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
> >>>   NAs introduced by coercion to integer range
> >>>
> >>>
> >>> Any help or suggestions will be greatly appreciated.
> >>>
> >>> Thanks,
> >>>
> >>> Maram Salem
> >>>
> >>>         [[alternative HTML version deleted]]
> >>>
> >>> ______________________________________________
> >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >>> 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]]



More information about the R-help mailing list