当我运行以下代码时,我的数据集中的所有变量都被删除了
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)
,这是什么都没有,所以它应该删除任何内容并保留数据集。
我知道我可能会错过一个非常基本的概念,但我想学习。
答案 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)]
}