在插入符号中的nearZeroVar函数

时间:2015-01-20 07:09:24

标签: r r-caret

当我运行以下代码时,我的数据集中的所有变量都被删除了

data <- data[, -nearZeroVar(data)]

我对R相当新,我的期望是上面的代码会删除近零方差预测值,如果它们在数据集中,实际上数据中没有接近零的方差预测因子,所以我认为它会保持数据集不变,但它没有。

运行脚本时我不会总是知道预测变量是否接近零方差预测值....我如何修改代码将其添加到脚本中,检查是否存在接近零的方差预测值,如果没有一个预测变量是接近零的方差预测因子,那么它应该保留数据集。

以下代码重现了这种情况。

library(caret)
data(GermanCredit)
# remove the near-zero var predictors
GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)] 
# but now if i redo the above command it removes all the predictors from the data set.
GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)]
# all predictors removed

有些情况下,我们不知道数据集不包含任何接近零的方差预测因子。

更新

@ LauriK,topepo(Max):一个更愚蠢的问题,

GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)]`

我想如果我把上面的代码写成

GermanCredit <- GermanCredit[, -integer(0)]

因为在integer(0)之前有一个( - )符号,所以它应该删除integer(0),这是什么都没有,所以它应该删除任何内容并保留数据集。

我知道我可能会错过一个非常基本的概念,但我想学习。

2 个答案:

答案 0 :(得分:3)

首先保存对象:

nzv_cols <- nearZeroVar(GermanCredit)
if(length(nzv_cols) > 0) GermanCredit <- GermanCredit[, -nzv_cols]

最高

答案 1 :(得分:2)

您也应该查看两者之间的值,而不仅仅是将它们放在一行中。

> nearZeroVar(GermanCredit)
 [1]  9 15 16 24 25 27 28 30 34 45 47 54 59

意味着这些方差接近于零。如果删除这些,则数据集将保留49个变量。 现在,如果再次运行同一行,结果会有所不同:

> nearZeroVar(GermanCredit)
integer(0)

这意味着没有剩下的变量是零方差。这是一个空集。如果您将变量按空集合进行子集化,则不会遗漏任何内容。

> str(GermanCredit[, -integer(0)])
'data.frame':   1000 obs. of  0 variables

所以你应该做的一开始就是不要两次运行。 但即使您只运行一次,将其置于IF子句中也是有意义的:

if (length(nearZeroVar(GermanCredit)) > 0) {
  GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)] 
}