创建样本数据集
set.seed(23452)
##create 5 variables with 15 levels and 5 variables with 20 levels
nrowd <- 100
full <- data.frame(
replicate(5,letters[sample(sample(1:24,15),nrowd,replace=TRUE) ]),
replicate(5,LETTERS[sample(sample(1:24,20),nrowd,replace=TRUE) ])
)
###the following code represents a process that creates a dataframe with variables
###that have no more levels than full but may have fewer levels
scoring.set <- data.frame(sapply(full[sample(1:nrow(full),10),],as.character))
#factor levels are not the same
identical(sapply(full,levels),sapply(scoring.set,levels))
这里是你会如何修复因子水平。
##make it so the levels of scoring.set variables have the levels of full
scoring.set2 <- data.frame(
mapply(scoring.set,lapply(full,levels), SIMPLIFY=FALSE,
FUN=function(scoring.var, full.level){
factor(scoring.var, levels=union(full.level,levels(scoring.var)))
})
)
的变量仍然和以前一样,现在他们有相同的水平全
all(
mapply(scoring.set,scoring.set2, FUN=function(x,y){
identical(as.character(x),as.character(y))
})
)
identical(sapply(full,levels),sapply(scoring.set2,levels))
引进非因子变量将复杂的事情,但一般的想法是将子集只有因子变量factor.vars <- scoring.set[,sapply(scoring.set, is.factor)]
,然后执行类似data.frame(fixed.factor.vars, scoring.set[,!sapply(scoring.set,is.factor)])[,names(scoring.set)]
的操作,以便按相同顺序将所有内容重新组合在一起。
我的想法是有一些方法来存储一个变量列表与他们想要的因子水平,但我还没有能够拿出它呢。 –
这条线并不像我特别讨厌的那样 - 特别是它在代码行方面效率很高。你可以保持水平作为一个向量列表 - 会更好吗? –
恩,谢谢!我想这不是线路本身,而是存储一个数据帧,只是为了它的因子水平。无法确定是否值得重组代码。 –