我是编程新手。但是这里是我试图从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;非常感谢。请告诉我是否应该分享一些细节。
答案 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