如何在没有eval,parse,text = paste的情况下正确循环(“...在R中

时间:2013-01-08 21:58:57

标签: r parsing eval

所以我有一个朋友用一些R代码帮助我,我感觉不好,因为代码有效,但我很难理解和改变它,我觉得这不正确或正确的代码。

我将文件加载到单独的R数据帧中,标记为x1,x2 ... xN等。

我想要合并数据框,这就是我们需要工作的代码:

assign("x",eval(parse(text=paste("rbind(",paste("x",rep(1:length(toAppend)),sep="",collapse=", "),")",sep=""))))

“toAppend”是加载到x1,x2等数据框中的文件列表。

如果没有所有文本代码技巧,它应该是这样的:

x <- rbind(##x1 through xN or some loop for 1:length(toAppend)#)

为什么R不能在没有评估文本技巧的情况下获取代码?这是好的代码吗?如果我使用这个IRL,我会被解雇吗?你知道一种正确的方法来把它写成循环吗?有没有办法没有循环?一旦我将这些文件/数据帧组合在一起,我就拥有超过3000万行的数据集,这对使用循环非常缓慢。运行我的示例代码行需要超过24小时才能从~400个文件中获取30M行数据集。

1 个答案:

答案 0 :(得分:2)

如果这些数据框架都具有相同的结构,那么通过使用read.tableread.csv步骤的'colClasses'参数,您将节省大量时间。 lapply函数可以将此函数传递给read.*函数,如果你使用Dason猜测你真正在做什么,那就是:

 x <- do.call(rbind, lapply(file_names, read.csv, 
                                colClasses=c("numeric", "Date", "character")
               ))   # whatever the ordered sequence of classes might be

rbind无法获取角色向量的原因是对象的名称是“语言”对象,而字符向量是......而不是语言类型。通过将“语言”与R中的“数据”分开的半透膜推动字符向量需要使用assigndo.call eval(parse())或环境或参考类或我忘记的其他方法