在没有数据帧的情况下跟踪因子水平

时间:2012-08-23 18:41:19

标签: r r-factor

免责声明:这个项目是以别人的代码开始的,我确信有非优化的设计决策,但是我的手比我自己的项目更加紧密。

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

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

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

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

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

提前致谢,我将随时准备详细说明。

1 个答案:

答案 0 :(得分: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))) 
     }) 
)

变量仍然与以前相同,现在它们与完整

具有相同的级别
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)]的操作,以便以相同的顺序将所有内容重新组合在一起。