防止sapply返回3D阵列

时间:2014-03-07 16:03:49

标签: r sapply

如果我使用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)似乎非常简洁。

2 个答案:

答案 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]), ])