我有这样的矢量:
dput(xv)
c("Users", "Transactions", "Workload")
我需要能够使用函数基于向量xv中的条目创建空数据帧。
例如,它应该是这样的:
new_df <- data.frame(
Users = character(),
Transactions = character(),
Workload = character()
)
因为xv中的值可能会改变,xv中的条目数也会改变,我需要能够使用函数来做到这一点吗?
我有什么想法可以做到这一点?
答案 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)