2

免责声明:这个项目一开始是别人的代码,我敢肯定有非最佳的设计决策,但我的手比我自己的项目更受束缚。

我有一个机器学习算法,它使用经过训练的模型对象和一组评分数据来创建评分数据的数据框。模型对象是一个带有公式和数据框的列表。

模型数据框的作用之一是确保评分数据框具有与模型预期相同的列,并且这些列的因子水平相同。为了实现这一点,我们将任意一行的训练数据存储在model$df(数据框)中,因为没有行的数据框被迫没有因子级别。然后我们使用有点笨拙的线

scoring.set$df <- rbind(model$df, scoring.set$df)[-1, ]

这会产生具有相同值但扩展因子水平的评分数据框。我的理解是,rbind强制两个数据帧的因子变量中的水平等于两个单独帧中水平的并集,所以这几乎完全符合我的需要。

但是,我确信这不是正确的方法。有什么建议吗?

提前致谢,我会等着详细说明。

4

1 回答 1

1

创建示例数据集

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))) 
     }) 
)

变量仍然与以前相同,现在它们具有与 full 相同的级别

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)]让所有东西以相同的顺序重新组合在一起。

于 2012-08-23T19:47:26.753 回答