Thaler, Thorn, LAUSANNE, Applied Mathematics
2011-Apr-12 11:34 UTC
[R] lapply over list and the respective name of the list item
Hi all, I find myself sometimes in the situation where I lapply over a list and in the particular function I'd like to use the name and or position of the respective list item. What I usually do is to use mapply on the list and the names of the list / a position list: o <- list(A=1:3, B=1:2, C=1) mapply(function (item, name) paste(name, sum(item), sep="="), o, names(o)) mapply(function (item, pos) paste(pos, sum(item), sep="="), o, seq_along(o)) [another way would be, of course, to use a for loop, but I'm slightly reluctant to use for loops knowing that I definitely misuse lapply sometimes] Now I was wondering whether there is a better way of doing this? Or is the mapply approach already the best way? In other words, is there any possibility within lapply to get any information about the context of the respective item? To give you an example where this could be useful: Imagine we have a dataframe and we want to replicate (more general apply a function to) each column and the result should be a dataframe again, where the new columns bear the name of their respective parent column amended by some suffix. Using mapply I'd do something like: d <- data.frame(A=1:3, B=2:4) Reduce(cbind, mapply(function (col, nam) { td <- as.data.frame(do.call(cbind, rep(list(col), 3))) names(td) <- paste(nam, 1:3, sep = "_") td}, d, names(d), SIMPLIFY=FALSE)) Any suggestions? Or is it already the state of the art? Any help appreciated. BR Thorn