Nicolás Vargas Nicolás Vargas - 22 days ago 6
R Question

Use lapply to modify the data of an xts contained on a list

I am trying to change the first data of all the xts I have contained within a list but I can't seem to figure out how the syntax would be for

lapply
to do this. I have tried with:

b = lapply(a, function(a) a[1,]=1)


But this erases all the other rows' data. Does anyone knows the right syntax to address to the first data and modify it.

Thanks

Answer Source

Your internal function returning the a[1,]=1 as a result, therefore you didn't have the whole xts stored.

Use like this:

b <- lapply(a, function(a) { a[1,] = 1; a })

Another way is to use [<- (anonymous assignment):

b <- lapply(a, `[<-`, 1, TRUE, 1)

library(microbenchmark)
library(xts)

data(sample_matrix)
sample.xts <- as.xts(sample_matrix, descr='my new xts object')

a <- rep(list(sample.xts), 2000)

microbenchmark(assign = lapply(a, function(a) { a[1,] = 1; a }),
               anon_assign = lapply(a, `[<-`, 1, TRUE, 3))

Unit: milliseconds
        expr      min       lq     mean   median       uq       max neval
      assign 33.50660 39.90533 58.75338 43.74316 88.39256 128.15991   100
 anon_assign 29.95665 32.37879 44.80245 34.11000 38.87301  97.35795   100

Therefore, the anonymous assign version is much faster.