动态分配data.frame并带宽限

时间:2014-06-27 09:09:03

标签: r dataframe

我有一个数据帧应该在运行时增长(添加行)。事先预先分配数据帧是明智的(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(此处为arbitraryDf())

中提取df布局的信息

2 个答案:

答案 0 :(得分:3)

我不确定这是否是您要找的。函数gendf有两个参数 - 模板数据框和行数。它根据具有给定行数的模板返回空数据帧。

arbitraryDf <- data.frame(C = "char", L = T, N = 4.5, stringsAsFactors = F)
arbitraryDf

gendf <- function(df, N) {
  # Create list of modes
  modes <- lapply(df, storage.mode)
  # Return data.frame
  return(data.frame(lapply(modes, vector, N)))
}

x <- gendf(arbitraryDf, 10)
class(x)

答案 1 :(得分:2)

为了概括Simon的评论,也许这样的事情会对你有用:

myFun <- function(sourceDF, length) {
  Classes <- sapply(sourceDF, class)
  data.frame(lapply(Classes, vector, length = length))
}

在这里,我们首先提取源data.frame的每一列的类,并将其用作新data.frame的模板,其长度由length参数确定。< / p>

示例:

myFun(arbitraryDf(), 5)
#   C     L N
# 1   FALSE 0
# 2   FALSE 0
# 3   FALSE 0
# 4   FALSE 0
# 5   FALSE 0