如何使用 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 中的函数创建一个空数据框? [复制]的主要内容,如果未能解决你的问题,请参考以下文章