如何在不使用插入符号包的情况下去除接近零的方差?

时间:2018-04-21 21:23:03

标签: r r-caret

我是编程新手。但是这里是我试图从nearZeroVar包中移除caret函数的代码片段:

N <- 200 # number of points per class
D <- 2 # dimensionality
K <- 4 # number of classes
X <- data.frame() # data matrix (each row = single example)
y <- data.frame() # class labels

...(some lines are omitted)...

X <- as.matrix(X)
Y <- matrix(0, N * K, K)
for (i in 1:(N * K)) { Y[i, y[i,]] <- 1}

...(some lines are omitted)...

nzv <- nearZeroVar(train)
nzv.nolabel <- nzv-1

inTrain <- createDataPartition(y=train$label, p=0.7, list=F)

training <- train[inTrain, ]
CV <- train[-inTrain, ]

X <- as.matrix(training[, -1])
N <- nrow(X)
y <- training[, 1]

K <- length(unique(y))
X.proc <- X[, -nzv.nolabel]/max(X)
D <- ncol(X.proc)

Xcv <- as.matrix(CV[, -1])
ycv <- CV[, 1]
Xcv.proc <- Xcv[, -nzv.nolabel]/max(X)

Y <- matrix(0, N, K)

因此,为了摆脱nearZeroVar函数,我尝试使用Filter函数和以下foo函数:

foo <- function(data) {
out <- lapply(data, function(x) length(unique(x)))
want <- which(!out > 1)
unlist(want)
}

nzv <- foo(trainingSet)
nzv.nolabel <- nzv - 1

但我收到错误消息:&#34; X [,training.nolabel]错误:维度数不正确。执行停止&#34;或类似的东西&#34;不合适的数组&#34;。关于如何解决`nearZeroVar&#34;非常感谢。请告诉我是否应该分享一些细节。

1 个答案:

答案 0 :(得分:0)

从发布的代码中看不出来Filter()的使用方式。 请尝试以下;

# create sample data
R> df <- data.frame(a=1:10, b=sample(10:19), c=rep(5,10))
R> df
    a  b c
1   1 16 5
2   2 17 5
3   3 18 5
4   4 13 5
5   5 15 5
6   6 14 5
7   7 11 5
8   8 12 5
9   9 19 5
10 10 10 5

创建自定义函数,例如;

R> zeroVarianceCol<- function(df){
  new_df<-Filter(var,df)
  }

将数据框传递给x<- zeroVarianceCol(df)这样的自定义函数将删除接近零的方差列,在本例中为c列。

R> x
    a  b
1   1 16
2   2 17
3   3 18
4   4 13
5   5 15
6   6 14
7   7 11
8   8 12
9   9 19
10 10 10