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

Ralph S. ruffel1 at hotmail.com
Sun Jul 20 01:17:39 CEST 2008


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


More information about the R-help mailing list