2017-08-22 95 views
0

我经常写这样的代码:创建一个行数据帧,每一个栏是与现有的变量

answer.df = data.frame(x = numeric(0), y = numeric(0), z = numeric(0)) 
for (i in 1:100) { 
    x = do_stuff(i) 
    y = do_more_stuff(i) 
    z = yet_more_stuff(i) 

    # Is there a better way of doing this: 
    temp.df = data.frame(x = x, y = y, z = z) 

    answer.df = rbind(answer.df, temp.df) 
} 

我的问题是,在该行temp.df = data.frame(x = x, y = y, z = z)有没有这样做的一个更合适的方法这个?想象一下,用十个或更多变量来理解我的问题。

+2

没有直接回答你的问题,但是,往往存在(几乎总是)一更好的方式来创建data.frame,而不是'rbind'内部的'for'循环 – SymbolixAU

+3

Better * how *?你不需要为数据框命名参数 - 只要你想要相同的名字,你可以只做'data.frame(x,y,z)'。如果x,y,z在列表中,而不是单独的变量,那么可以使用'as.data.frame'。但是那条线看起来很好,真的。这是'rbind'这条线看起来很糟糕:像这样的循环内的成长对象是[地狱中的第二圈地狱](http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) 。预先分配您的'answer.df'并直接插入到该列表中,或者将列表中的向量保留在列表中,并在末尾将其转换为数据框。 – Gregor

+0

@SymbolixAU我只是在学习。婴儿的步骤。 – lebelinoz

回答

0

试试这个:

do.call("rbind", lapply(1:100, function(i) list(x = xfun(i), y = yfun(i)))) 

也可以尝试从rbindlist其中data.table可能有一定的性能优势:

library(data.table) 
rbindlist(lapply(1:100, function(i) list(x = xfun(i), y = yfun(i)))) 
相关问题