如果我使用sapply
在参数向量上应用函数并且该函数返回data.frame,则输出似乎被简化为3D数组。
例如:
set.seed(42)
fn <- function(i) data.frame(n=i, x=rnorm(2, i+2))
sapply(1:10, fn)
> [,1] [,2] [,3] [,4] ...
> n Integer,2 Integer,2 Integer,2 Integer,2 ...
> x Numeric,2 Numeric,2 Numeric,2 Numeric,2 ...
当我真正喜欢的是一个大数据框架时,就像输出一样:
do.call(rbind, sapply(1:10, fn, simplify=F))
> n x
> 1 1 3.205999
> 2 1 2.638943
> 3 2 4.758163
> 4 2 3.273295
> ...
如果我Vectorize()
函数,也会发生同样的情况。有没有办法避免制作data.frame列表然后重新绑定它们的开销?
我觉得我错过了一些明显的东西,但s/l/vapply
(和simplify2array
)似乎非常简洁。
答案 0 :(得分:1)
您如何看待这种方法:
fn <- function(i) c(i, x=rnorm(n=1, i+2))
data.frame(t(sapply(rep(1:10,each=2), fn)))
答案 1 :(得分:1)
好的,拿23或其他一些,这是一个允许你保持你的功能不变的选项。不幸的是,这会将所有内容强制转换为数字,这应该适合您的应用程序:
mx <- matrix(
unlist(sapply(1:10, fn))[unlist(lapply(1:4, seq, by=4, len=10))],
ncol=2
)
as.data.frame(mx[order(mx[, 1]), ])