サンプル データセットを作成する
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)]