[R] replicate matrix blocks different numbers of times into new matrix

jim holtman jholtman at gmail.com
Sun Jul 20 01:55:58 CEST 2008


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. <ruffel1 at hotmail.com> 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: p.dalgaard at biostat.ku.dk
>> To: ruffel1 at hotmail.com
>> CC: r-help at 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
>> ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
>>
>
> _________________________________________________
> _________________________________________________________________
>
>
> family_safety_072008
> ______________________________________________
> R-help at 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?



More information about the R-help mailing list