过滤掉R中的列

时间:2013-03-05 17:22:10

标签: r

参考帖子#Filtering out columns in R,所有1和0的列已成功从training_data中删除。然而,分类算法仍然抱怨除了1或2之外,其中MOST值为0的列(除了1或2个值之外,列中的所有值都是0)。

我正在使用penalizedSVM R包来执行功能选择。更仔细地查看数据集,函数svm.fs会抱怨大多数值为0的列,除了一个或两个。

如何修改(或添加内容)以下代码以实现结果。

lambda1.scad<-c(seq(0.01, 0.05, .01), seq(0.1, 0.5, 0.2), 1)
lambda1.scad<-lambda1.scad[2:3]
seed <- 123 

f0 <- function(x) any(x!=1) & any(x!=0) & is.numeric(x)
trainingdata <- lapply(trainingdata, function(data) cbind(label=data$label, 
                            colwise(identity, f0)(data)))

datax <- trainingdata[[1]]
levels(datax$label) <- c(-1, 1)
train_x<-datax[, -1]
train_x<-data.matrix(train_x)
trainy<-datax[, 1]

idx <- is.na(train_x) | is.infinite(train_x)
train_x[idx] <- 0

tryCatch(scad.fix<-svm.fs(train_x, y=trainy, fs.method="scad",
                          cross.outer=0, grid.search="discrete",
                          lambda1.set=lambda1.scad, parms.coding="none",
                          show="none", maxIter=1000, inner.val.method="cv",
                          cross.inner=5, seed=seed, verbose=FALSE), error=function(e) e)

或者可以提出完全不同的解决方案。

1 个答案:

答案 0 :(得分:1)

使用布尔值可以求和的事实并定义一些零容差:

sum(x == 0) / length(x) >= tolerance

这会成为您放弃的条件。然而,通常零不仅是有效数据,而且对于所研究的现象至关重要。在进行此方法之前,您应该仔细考虑您的算法选择以及删除列的决定。