Will this do it: > # determine the row numbers of each of the factors > x.row <- split(seq(nrow(x)), x[,1]) > # process the data and replicate the rows > result <- lapply(seq_along(x.row), function(.fact){ + x[rep(x.row[[.fact]], n[.fact]),] + }) > do.call(rbind, result) [,1] [,2] [1,] 1 1 [2,] 1 3 [3,] 1 1 [4,] 1 3 [5,] 2 4 [6,] 2 4 >
On Sat, Jul 19, 2008 at 7:17 PM, Ralph S. <[EMAIL PROTECTED]> wrote: > > Actually not quite - my mistake, since I oversimplified the problem I have. > > Here is a more realistic x matrix (plus some additional information): > > # the data > x<-matrix(c(1,1,2,1,3,4),3,2) > > # number of factors > n_f<-2 > > # number of rows taken by each factor > f_length <- c(2,1) > > # number of repetitions I want for the first and second factor > # actually, always the same factor of expansion: both factors are to be > replicated n times > n<-c(2,2) > > I want something like > > [,1] [,2] > [1,] 1 1 > [2,] 1 3 > [3,] 1 1 > [4,] 1 3 > [5,] 2 4 > [6,] 2 4 > > but it is only easy to get > [,1] [,2] > [1,] 1 1 > [2,] 1 1 > [3,] 1 3 > [4,] 1 3 > [5,] 2 4 > [6,] 2 4 > > I am not sure about the first target matrix. > > I could loop through each level of the factor, use a "which(x[,1]==f[k]" to > get the row indices for each factor f[k] and then replicate those indices n > times and append them to the result for the previous level of the factor. > This does not seem efficient, given that I actually have a large matrix with > more than 600 factors. > > Sorry for the initial misspecification - any ideas how I could solve my > problem? > > Best, > > Ralph > > ---------------------------------------- >> Date: Sat, 19 Jul 2008 21:39:25 +0200 >> From: [EMAIL PROTECTED] >> To: [EMAIL PROTECTED] >> CC: r-help@r-project.org >> Subject: Re: [R] replicate matrix blocks different numbers of times into new >> matrix >> >> Ralph S. wrote: >>> Hi, >>> >>> I am trying to replicate blocks of a matrix (defined by factors) into >>> another matrix, but an unequal, consecutive number of times for each factor. >>> >>> I need to find an elegant and fast way to do this, so loops will not work. >>> >>> An example of what I am trying to do is the following: >>> >>> # the data - first column entries are both data and the two factors >>> x<-matrix(c(1,2,3,4),2,2) >>> >>>> x >>>> >>> [,1] [,2] >>> [1,] 1 3 >>> [2,] 2 4 >>> >>> # the number of repetitions of the first and second factor >>> n<-c(1,3) >>> >>> This is what I want as output: >>> >>> [,1] [,2] >>> [1,] 1 3 >>> [2,] 2 4 >>> [3,] 2 4 >>> [4,] 2 4 >>> >>> >>> Any ideas how to get there? I have tried using tapply with combination of >>> rep, but this does not work (I need 1 and then 3 replications). >>> > [[elided Hotmail spam]] >>> >> Will this do? >> >> x[rep(1:2,n),] >> >> -- >> O__ ---- Peter Dalgaard Ă˜ster Farimagsgade 5, Entr.B >> c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K >> (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 >> ~~~~~~~~~~ - ([EMAIL PROTECTED]) FAX: (+45) 35327907 >> > > _________________________________________________ > _________________________________________________________________ > > > family_safety_072008 > ______________________________________________ > 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. > -- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve? ______________________________________________ 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.