我正在处理来自多个时间段的数据子集,我想在我的训练集上进行列和级别缩减,然后将相同的操作应用于相同结构的其他数据集
Hmisc包中的dataframeReduce是我一直在使用的,但将该函数应用于不同的数据集会导致稍微不同的操作。
trainPredictors<-dataframeReduce(trainPredictors,
fracmiss=0.2, maxlevels=20, minprev=0.075)
testPredictors<-dataframeReduce(testPredictors,
fracmiss=0.2, maxlevels=20, minprev=0.075)
testPredictors<-testPredictors[,names(trainPredictors)]
最后一行最终会出错,因为backPredictors已删除了trainPredictors保留的列。所有其他集应该将转换应用于应用于它们的trainPredictors。
有没有人知道如何使用dataframeReduce或其他函数/代码块将相同的清理操作应用于多个数据集?
一个例子
使用http://trinkerrstuff.wordpress.com/2012/05/02/function-to-generate-a-random-data-set/
中的NAins功能NAins <- NAinsert <- function(df, prop = .1){
n <- nrow(df)
m <- ncol(df)
num.to.na <- ceiling(prop*n*m)
id <- sample(0:(m*n-1), num.to.na, replace = FALSE)
rows <- id %/% m + 1
cols <- id %% m + 1
sapply(seq(num.to.na), function(x){
df[rows[x], cols[x]] <<- NA
}
)
return(df)
}
library("Hmisc")
trainPredictors<-NAins(mtcars, .1)
testPredictors<-NAins(mtcars, .3)
trainPredictors<-dataframeReduce(trainPredictors,
fracmiss=0.2, maxlevels=20, minprev=0.075)
testPredictors<-dataframeReduce(testPredictors,
fracmiss=0.2, maxlevels=20, minprev=0.075)
testPredictors<-testPredictors[,names(trainPredictors)]
答案 0 :(得分:0)
如果您的目标是使用相同级别的相同变量,那么您需要避免再次使用dataframeReduce
,而是使用与dataframeReduce
操作生成的相同列训练集并将因子减少逻辑应用于测试集,其方式导致后续比较操作需要任何程度的同源性。如果是计划的predict
操作,则需要将级别设置为相同,并且需要修改dataframeReduce
中适用于级别的代码:
if (is.category(x) || length(unique(x)) == 2) {
tab <- table(x)
if ((min(tab)/n) < minprev) {
if (is.category(x)) {
x <- combine.levels(x, minlev = minprev)
s <- "grouped categories"
if (length(levels(x)) < 2)
s <- paste("prevalence<", minprev, sep = "")
}
else s <- paste("prevalence<", minprev, sep = "")
}
}
因此,更好的问题陈述可能会产生更好的策略。这可能需要知道整个集合以及列车和测试集中的级别以及预期的测试或预测(但尚未说明)。