[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