逐行创build一个Rdataframe

我想在R中逐行构build一个数据框。我已经完成了一些search,所有我想出的build议是创build一个空列表,保留一个列表索引标量,然后每次添加到列表一个单行数据框,并提前一个列表索引。 最后,列表中的do.call(rbind,)

虽然这个工作,似乎非常繁琐。 没有一个更简单的方法来实现相同的目标?

显然,我指的是我不能使用某些apply函数的情况,并且显式地需要逐行创builddataframe。 至less,有没有一种方法可以push入列表的最后,而不是明确地跟踪最后使用的索引?

你可以通过追加或使用rbind()来逐行增长。

这并不意味着你应该。 dynamic生长的结构是在R中编码的最不有效的方法之一。

如果可以的话,只保存所有数据。

 N <- 1e4 # some magic number, possibly an overestimate DF <- data.frame(num=rep(NA, N), txt=rep("", N), # as many cols as you need stringsAsFactors=FALSE) # you don't know levels yet 

然后在你的操作中插入一行

 DF[i, ] <- list(1.4, "foo") 

这应该适用于任意的数据框架,并且要高效得多。 如果你超过N,你总是可以缩小空行。

可以将行添加到NULL

 df<-NULL; while(...){ #Some code that generates new row rbind(df,row)->df } 

例如

 df<-NULL for(e in 1:10) rbind(df,data.frame(x=e,square=e^2,even=factor(e%%2==0)))->df print(df) 

我非常喜欢Rcpp的原因是我并不总是知道R Core如何思考,而使用Rcpp往往不是,我不需要。

从哲学的angular度讲,你在function范式方面处于罪恶的状态,它试图确保每个价值都独立于其他价值。 改变一个值不应该导致另一个值的显着变化,你用C中指针共享表示的方式

当function性编程发出信号使小船驶出时,问题就出现了,小艇回复“我是灯塔”。 同时对一个想要处理的大物体进行一系列的小改动,把你放在灯塔的领地里。

在C ++ STL中, push_back()是一种生活方式。 它不尝试function性,但它确实试图有效地适应常见的编程习惯用法。

有了幕后的巧妙,你有时可以安排在每个世界上有一只脚。 基于快照的文件系统是一个很好的例子(从联合坐标这样的概念发展而来,这也是双方的利益)。

如果R核心想要这样做,底层向量存储可以像联合安装一样运行。 对vector存储的一个引用可能对下标1:N有效,而对同一存储的另一个引用对下标1:(N+1) 。 可能有保留存储尚未被有效引用的任何东西,但方便快速push_back() 。 在任何现有参考视为有效的范围之外追加时,您不违反function概念。

最终以增量方式添加行,则会耗尽预留的存储空间。 你需要创build一切的新副本,存储乘以一些增量。 我使用的STL实现在扩展分配时倾向于将存储乘以2。 我认为我在R内部阅读,有存储结构的存储增加20%。 不pipe怎样,增长操作都是以相对于所附元素总数的对数频率出现的。 在摊销基础上,这通常是可以接受的。

随着幕后花样的stream逝,我看到了更糟的情况。 每当你将一个新行push_back()到数据框上时,都需要复制一个顶级索引结构。 新行可以附加到共享表示,而不会影响任何旧的function值。 我甚至不认为这会使垃圾收集器变得复杂。 因为我不是build议push_front()所有引用是前缀引用分配的vector存储的前面。

这是一个愚蠢的例子,如何在Map()的输出上使用do.call(rbind,) ,[与lapply()类似lapply()

 > DF <- do.call(rbind,Map(function(x) data.frame(a=x,b=x+1),x=1:3)) > DF xy 1 1 2 2 2 3 3 3 4 > class(DF) [1] "data.frame" 

我经常使用这个构造。

如果注释要注册成为行的向量,使用c()连接它们,将它们逐行传递给matrix,然后将该matrix转换为dataframe。

例如,行

 dummydata1=c(2002,10,1,12.00,101,426340.0,4411238.0,3598.0,0.92,57.77,4.80,238.29,-9.9) dummydata2=c(2002,10,2,12.00,101,426340.0,4411238.0,3598.0,-3.02,78.77,-9999.00,-99.0,-9.9) dummydata3=c(2002,10,8,12.00,101,426340.0,4411238.0,3598.0,-5.02,88.77,-9999.00,-99.0,-9.9) 

可以被转换为一个dataframe,因此:

 dummyset=c(dummydata1,dummydata2,dummydata3) col.len=length(dummydata1) dummytable=data.frame(matrix(data=dummyset,ncol=col.len,byrow=TRUE)) 

无可否认,我看到了两个主要限制:(1)这只适用于单模数据,(2)你必须知道你的最终#列这个工作(即,我假设你没有与一个其最大行长度先验未知粗糙arrays)。

这个解决scheme看起来很简单,但是从我在R中进行types转换的经验来看,我确信它会带来新的挑战。 任何人都可以评论这个?