[R] A question on operation on list
Gavin Simpson
gavin.simpson at ucl.ac.uk
Thu Jul 23 09:16:09 CEST 2009
On Wed, 2009-07-22 at 14:07 -0700, megh wrote:
> Thanks for your suggestions. I need one more thing :
>
> x = y = vector("list")
> for (i in 1:5) x[[i]] = rnorm(2); y[[i]] = rnorm(2)
>
> Here I want to get t(x[[i]]) %*% y[[i]] for each i. Can anyone please help
> me?
Two ways:
set.seed(123)
x = y = vector("list")
for (i in 1:5) {
x[[i]] = rnorm(2)
y[[i]] = rnorm(2)
}
## option 1
X <- matrix(unlist(x), nrow = 2)
Y <- matrix(unlist(y), nrow = 2)
C <- crossprod(X, Y)
res1 <- diag(C)
## option 2
res2 <- lapply(1:5, function(i) t(x[[i]]) %*% y[[i]])
res2 <- unlist(res2)
all.equal(res1, res2) # should be TRUE
In this case, option 1 is quicker by a factor of 2 if that makes a
difference in your application, despite doing more manipulations:
foo1 <- function(x, y) {
X <- matrix(unlist(x), nrow = 2)
Y <- matrix(unlist(y), nrow = 2)
C <- crossprod(X, Y)
diag(C)
}
foo2 <- function(x, y) {
res <- lapply(1:5, function(i) t(x[[i]]) %*% y[[i]])
unlist(res)
}
system.time(replicate(10000, foo1(x,y)))
system.time(replicate(10000, foo2(x,y)))
> system.time(replicate(10000, foo1(x,y)))
user system elapsed
0.535 0.003 0.540
> system.time(replicate(10000, foo2(x,y)))
user system elapsed
0.994 0.001 1.022
HTH
G
>
> Regards,
>
>
>
> Jorge Ivan Velez wrote:
> >
> > Hi megh,
> > Perhaps?
> >
> > # Data
> > x = vector("list")
> > for (i in 1:5) x[[i]] = rnorm(2)
> >
> > # 2x2 matrices
> > res <- lapply(x, function(a) a %*% t(a) )
> > res
> >
> > # Funcion from ?Reduce
> > add <- function(x) Reduce("+", x)
> >
> > # Summing up!
> > add(res)
> >
> > See ?lapply and ?Reduce for more information.
> >
> > HTH,
> >
> > Jorge
> >
> >
> > On Wed, Jul 22, 2009 at 3:18 PM, megh <megh700004 at yahoo.com> wrote:
> >
> >>
> >> Hi,
> >> I have created a list object like that :
> >> x = vector("list")
> >> for (i in 1:5) x[[i]] = rnorm(2)
> >> x
> >>
> >> Now I want to do two things :
> >> 1. for each i, I want to do following matrix calculation : t(x[[i]]) %*%
> >> x[[i]] i.e. for each i, I want to get a 2x2 matrix
> >> 2. Next I want to get x[[1]] + x[[2]] +....
> >>
> >> I did following : res=vector("list"); res = sapply(x, function(i)
> >> t(x[[i]])
> >> %*% x[[i]])
> >> However above syntax is not giving desired result. Any suggestion please?
> >>
> >> --
> >> View this message in context:
> >> http://www.nabble.com/A-question-on-operation-on-list-tp24612796p24612796.html
> >> Sent from the R help mailing list archive at Nabble.com.
> >>
> >> ______________________________________________
> >> 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.
> >>
> >
> > [[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.
> >
> >
>
--
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
Dr. Gavin Simpson [t] +44 (0)20 7679 0522
ECRC, UCL Geography, [f] +44 (0)20 7679 0565
Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk
Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/
UK. WC1E 6BT. [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
More information about the R-help
mailing list