r - How can I flatten two lists within a list without using data.table? -
i form 1 data.frame lists within list
l1 <- list(a = c(1, 2, 3), b = c(5, 6, 7)) l2 <- list(a = c(11, 22, 33), b = c(15, 16, 17)) l3 <- list(l1, l2) l3 library(data.table)
according 'data.table' manual : "'rbindlist' same do.call("rbind",l), faster"
i achieve 'rbindlist' using r base package
rbindlist need 'do.call' not!
rbindlist(l3)
do.call not want
do.call(rbind, l3) identical(rbindlist(l3), do.call(rbind, l3))
i'd think calling as.data.frame
each time costly. how about?
as.data.frame(do.call(mapply, c(l3, fun=c, simplify=false)))
mapply
takes first elements of l3 , applies function fun
, 2nd element , on... suppose you'd 2 lists (l3[[1]]
, l3[[2]]
), you'd do:
mapply(fun=c, l3[[1]], l3[[2]], simplify=false)
here simplify=false
makes sure output not converted (or simplified) matrix. it'll list. general case, use do.call
, pass our list other arguments function mapply
. hope helps.
benchmarking on big data:
ll <- unlist(replicate(1e3, l3, simplify=false), rec=false) aa <- function() as.data.frame(do.call(mapply, c(ll, fun=c, simplify=false))) bb <- function() do.call(rbind, lapply(ll, as.data.frame)) require(microbenchmark) microbenchmark(o1 <- aa(), o2 <- bb(), times=10) unit: milliseconds expr min lq median uq max neval o1 <- aa() 4.356838 4.931118 5.462995 7.623445 20.5797 10 o2 <- bb() 673.773795 683.754535 701.557972 710.535860 724.2267 10 identical(o1, o2) # [1] true
Comments
Post a Comment