【发布时间】:2014-08-18 08:09:21
【问题描述】:
我有一个数据框应该在运行时增长(添加行)。明智的做法是预先分配数据帧 (cmp.The R Inferno)。预分配例程应该接受所有类型的数据框组合(即列数和列类)。
示例
arbitraryDf<-function(){
return(data.frame(C="char",L=TRUE,N=4.5,stringsAsFactors=FALSE))
}
返回一个任意数据框以用作模板。我需要N <- 10 行,所以我可能会这样做:
data<-as.data.frame(lapply(arbitraryDf(),function(x){eval(parse(text=paste(class(x),"(",N,")")))}),stringsAsFactors=FALSE)
返回所需的数据帧。
>data
C L N
1 FALSE 0
2 FALSE 0
3 FALSE 0
4 FALSE 0
5 FALSE 0
6 FALSE 0
7 FALSE 0
8 FALSE 0
9 FALSE 0
10 FALSE 0
>sapply(data,class)
C L N
"character" "logical" "numeric"
不用说,eval() 的使用是丑陋的。有没有更直接的解决方案?
如前所述,例程需要接受任何数据帧组合,否则@mnel's answer 就足够了。
更新
本质上,我想达到和
一样的效果data <- data.frame(x= numeric(N), y= integer(N), z = character(N))
但以通用方式,适用于任何 df 布局。 df 布局的信息应该从给定的 df 中绘制(这里是任意的 Df())
【问题讨论】:
-
您在寻找类似
do.call(rbind, replicate(N, arbitraryDf(), FALSE))的东西吗?你到底想达到什么目的? -
@Ananda 如前所述,目标是分配一个数据帧。列号和类在运行前是未知的。您的解决方案很好,但也复制了 data.frame 的内容
-
我将使用
vector函数进行分配,但是您没有提供足够的详细信息来正确建议,您的用例没有得到很好的解释。我看不出rbinding 一个完整的行与[<-子集和替换有任何区别。如果你不得不预先分配我会看例如N <- 10;df <- data.frame( n = vector("numeric",N) , c = vector("character",N) )