如何使用 R 中的函数创建一个空数据框? [复制]

Posted

技术标签:

【中文标题】如何使用 R 中的函数创建一个空数据框? [复制]【英文标题】:how do you create an empty data frame using a function in R? [duplicate] 【发布时间】:2016-10-25 21:14:14 【问题描述】:

我有一个这样的向量:

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

我需要能够使用函数根据向量 xv 中的条目创建一个空数据框。

例如应该是这样的:

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

由于 xv 中的值可能会发生变化,并且 xv 中的条目数也可能会发生变化,所以我需要能够使用函数来做到这一点?

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

【问题讨论】:

如果列类型不同,列数不同,为什么需要一个函数。你可以使用setNames(data.frame(....), xv) 【参考方案1】:

我认为这是你想要的:

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 也被用于设置生成的data.frame 的名称,所以它将是如果它包含非字符元素,则非常值得怀疑。所以我的解决方案实际上并没有我想象的那么明智。

这是使用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)

【讨论】:

谢谢你,效果很好【参考方案2】:

由于 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 

matrix(.. 部分是从@ZheyuanLi 的评论中窃取的。

【讨论】:

@ZheyuanLi 他用列类让它更完美了。【参考方案3】:

我会这样做:

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)

【讨论】:

以上是关于如何使用 R 中的函数创建一个空数据框? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

R数据框复制不同空列中的值

如何在 R 中将行添加到带有标题的空数据帧? [复制]

R - 如何使用 sparklyr 复制火花数据框中的行

R使用标题向量创建空数据框[重复]

R使用tmaptools为sf对象中的每一行创建边界框

R语言实战应用精讲50篇(十五)-R语言如何实现数据的导入导出操作