2012-08-23 39 views
2

免责声明:该项目始于其他人的代码,并且我确定存在非最佳的设计决策,但我的手比我自己的手更紧密项目。在没有数据框的情况下跟踪因素水平

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

该模型的数据框架的作用之一是确保评分数据框具有与模型期望的列相同的列,并且这些列的因子级别相同。为了达到这个目的,我们在model$df(数据帧)中存储一行任意一行的训练数据,因为没有行的数据帧被迫没有因子水平。然后,我们使用有点遗漏线

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

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

但是,我确定这不是正确方式。任何建议?

在此先感谢,我会站在旁边详细说明。

+0

我的想法是有一些方法来存储一个变量列表与他们想要的因子水平,但我还没有能够拿出它呢。 –

+2

这条线并不像我特别讨厌的那样 - 特别是它在代码行方面效率很高。你可以保持水平作为一个向量列表 - 会更好吗? –

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

+1

你的第一个测试看起来是重复的。如果你的意思是:'相同(as.character(full),as.character(scoring.set2))'....它返回FALSE。 –

+0

固定........... – Michael

相关问题