Kliethermes, Stephanie A
2011-Aug-05 21:42 UTC
[R] jagged array (matrices of different dimensions)
Dear all,
I am having trouble creating a "jagged array" in R. I have found no
commentary on how to do it in the help files, but maybe I am misunderstanding
the purpose of some of the array functions (e.g. tapply).
I am using a longitudinal dataset where each individual has a different number
of time points (observations). I need to create correlation structures for each
individual which are necessarily different lengths. Currently I am using for
loops in an attempt to do so. The closest I can get is with the following code
(n=3) where I create matrices of the same dimensions with NA's for
timepoints not used. Perhaps there is simply a way to drop these NA's?
I would appreciate any thoughts on how to create a jagged array to store
matrices of different dimensions or direction towards a help-file or package
that will help me out.
Thanks in advance!
n<-3 #sample size
tim<-c(10,12,5) #number of observations per individual
tim.pts<-12 #number of possible observations
struc<-array(NA,dim=c(tim.pts,tim.pts,n))
for(i in 1:n){
for(k in 1:tim[i]){
for(j in k:tim[i]){
struc[k,j,i]<- (exp(-(j-k)))
struc[j,k,i]=struc[k,j,i]
}
}
}
[[alternative HTML version deleted]]
Dear Stephanie,
At first I just tried typing and ended up with a butcchered
frankenstein of a solution. Then I thought about (novel, right? ;)
and realized several of the steps in your for loop could be simplified
substantially, namely, the last step is just: exp(- (0:(i - k)))
Then I just pad the start of each vector with NAs, use sapply() which
will automatically simplify to a matrix, rather than using an array,
use a list to store the different sized matrices. The result is:
tim <- c(10,12,5) #number of observations per individual
struc <- lapply(tim, function(i) {
sapply(1:i, function(k) {
c(rep(NA, k - 1), exp(- (0:(i - k))))
})
})
three different sized matrices in a list. If you need the full
correlation matrix, not just the lower triangle, you can look at ?t
and ?lower.tri
Hope this helps,
Josh
On Fri, Aug 5, 2011 at 2:42 PM, Kliethermes, Stephanie A
<stephanie-kliethermes at uiowa.edu> wrote:> Dear all,
>
>
>
> I am having trouble creating a "jagged array" in R. ?I have found
no commentary on how to do it in the help files, but maybe I am misunderstanding
the purpose of some of the array functions (e.g. tapply).
>
>
>
> I am using a longitudinal dataset where each individual has a different
number of time points (observations). ?I need to create correlation structures
for each individual which are necessarily different lengths. ?Currently I am
using for loops in an attempt to do so. ?The closest I can get is with the
following code (n=3) where I create matrices of the same dimensions with
NA's for timepoints not used. ?Perhaps there is simply a way to drop these
NA's?
>
>
>
> I would appreciate any thoughts on how to create a jagged array to store
matrices of different dimensions or direction towards a help-file or package
that will help me out.
>
>
>
> Thanks in advance!
>
>
>
>
>
> ?n<-3 ? ? #sample size
> tim<-c(10,12,5) ? #number of observations per individual
> ?tim.pts<-12 ? ? ? ?#number of possible observations
> ?struc<-array(NA,dim=c(tim.pts,tim.pts,n))
>
>
> for(i in 1:n){
>
> ? for(k in 1:tim[i]){
> ? for(j in k:tim[i]){
> ? ? struc[k,j,i]<- ?(exp(-(j-k)))
> ? ?struc[j,k,i]=struc[k,j,i]
> ? ?}
> ?}
>
>
> ? ? ? ? ? ?}
>
> ? ? ? ?[[alternative HTML version deleted]]
>
> ______________________________________________
> 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.
>
--
Joshua Wiley
Ph.D. Student, Health Psychology
Programmer Analyst II, ATS Statistical Consulting Group
University of California, Los Angeles
https://joshuawiley.com/