【问题标题】:how do you create an empty data frame using a function in R? [duplicate]如何使用 R 中的函数创建一个空数据框? [复制]
【发布时间】: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)

标签: r


【解决方案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)

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2016-11-01
    • 2021-12-12
    • 1970-01-01
    • 2020-04-19
    • 2023-03-21
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多