我有一个数据帧应该在运行时增长(添加行)。事先预先分配数据帧是明智的(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布局的信息答案 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