2014-03-07 39 views
0

如果我使用sapply将函数应用于参数向量并且该函数返回data.frame,则输出似乎被简化为3D数组。防止sapply返回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 ... 

当什么其实我喜欢的是一个大的data.frame,如由输出:

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)似乎相当简洁。

回答

1

您如何看待这种做法的:

fn <- function(i) c(i, x=rnorm(n=1, i+2)) 
data.frame(t(sapply(rep(1:10,each=2), fn))) 
+0

谢谢你没有想到这一点。理想情况下,(实际)函数会像内部处理data.frames一样离开,但如果没有更好的方法提供,将会接受。 – blmoore

+0

也许你可以用'reshape()'来做到这一点格式=“长” – Rentrop

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