如何使用R中的函数创建空数据框?

时间:2016-06-23 13:36:59

标签: r

我有这样的矢量:

dput(xv)
c("Users", "Transactions", "Workload")

我需要能够使用函数基于向量xv中的条目创建空数据帧。

例如,它应该是这样的:

new_df <- data.frame(
    Users = character(), 
    Transactions = character(), 
    Workload = character()
)

因为xv中的值可能会改变,xv中的条目数也会改变,我需要能够使用函数来做到这一点吗?

我有什么想法可以做到这一点?

3 个答案:

答案 0 :(得分:4)

我认为这可以满足您的需求:

do.call(data.frame,setNames(lapply(xv,function(e) vector(typeof(e))),xv));
## [1] Users        Transactions Workload
## <0 rows> (or 0-length row.names)

编辑:感谢@Zheyuan让我更多地考虑我的解决方案。由于输入(由OP指定)是原子向量,因此它不能包含异构数据类型,因此根据每个输入元素的类型生成单独的零长度向量的lapply()调用不提供效益。如果xv是一个可以包含异构数据类型的列表,那么它提供一个好处,但由于xv也被用于设置结果数据的名称。如果它包含非字符元素,那将是非常值得怀疑的。所以我的解决方案实际上并不像我想象的那样合理。

这是使用do.call(data.frame,...)模式的更明智的解决方案,它将lapply()调用替换为rep()

do.call(data.frame,setNames(rep(list(character()),length(xv)),xv));
## [1] Users        Transactions Workload
## <0 rows> (or 0-length row.names)

答案 1 :(得分:3)

由于OP需要一个功能,因为我首先评论了setNames

f1 <- function(nm1){
       len <- length(nm1)
       setNames(as.data.frame(matrix(typeof(nm1), 0, len), 
                      stringsAsFactors=FALSE), nm1) 
     }

f1(xv)
#[1] Users        Transactions Workload    
#<0 rows> (or 0-length row.names)

str(f1(xv))
#'data.frame':   0 obs. of  3 variables:
#$ Users       : chr 
#$ Transactions: chr 
#$ Workload    : chr 

@ ZheyuanLi评论中matrix(..部分被盗。

答案 2 :(得分:2)

我会做这样的事情:

MakeDF.R <- function(CustomVector){
  NewDF <- data.frame(matrix(nrow=0,ncol=length(CustomVector)))
  #Matrixes can be easier to make, and wrapping in data.frame() quickly converts them
  colnames(NewDF) <- CustomVector
  #give the New dataframe columns names based on the vector you fed in
  return(NewDF)
}

所以调用下面的函数

CusVec<-c('a','b','c')
CustomDF <- MakeDF.R(CusVec)

返回

> CustomDF
[1] a b c
<0 rows> (or 0-length row.names)

或者获取具有设定行数的数据帧(对于插入数据更有效,而不是每次创建新行,如果你知道你想要多少行,那么)

CusVec<-c('a','b','c')

MakeDF.R <- function(CustomVector,n){
  NewDF <- data.frame(matrix(nrow=n,ncol=length(CusVec)))
  colnames(NewDF) <- CustomVector
  return(NewDF)
}

CustomDF <- MakeDF.R(CusVec,3)