排除没有差异的列

时间:2015-12-31 07:49:35

标签: r variance

如何从近1,000个变量的数据矩阵中排除方差等于0(零)的变量/列(即变量/列中的所有情况/观察值具有相同的值)?我可以设想计算每列的差异,然后手动写入要排除的列数(或者包括在内,因为这似乎更容易在R中进行)。但是肯定在R中有更优雅和省时的解决方案。 提前谢谢!

2 个答案:

答案 0 :(得分:4)

我们可以使用Filter

Filter(var, df1)

答案 1 :(得分:3)

caret包提供了一些有用的功能:http://topepo.github.io/caret/preprocess.html#nzv

  

nearZeroVar:识别近零方差预测值

     

nearZeroVar诊断具有一个唯一值(即零方差预测值)的预测变量或具有以下两个特征的预测变量:它们相对于样本数量和最频率的比率具有非常少的唯一值第二个最常见值的频率的共同值很大。 checkConditionalX查看以y为单位调整的x列的分布,并标识在y组内稀疏的x列。

另请注意:var()功能缓慢。我们可以使用更有效的解决方案。其中一些比较:

dataset <- data.frame(replicate(10, runif(100)),
                      replicate(10, rep(0, 100)))
microbenchmark::microbenchmark(
    var = Filter(var, dataset),
    var2 = Filter(function(x) sum((x - sum(x) / length(x))^2), dataset),
    range = Filter(function(x) diff(range(x)), dataset),
    range2 = Filter(function(x) max(x) - min(x), dataset))
#> Unit: microseconds
#>    expr     min       lq      mean   median       uq      max neval cld
#>     var 334.058 359.1545 419.89933 418.8425 439.5935 1707.222   100   c
#>    var2  74.457  78.8310  87.47988  87.4805  94.1590  127.932   100 a  
#>   range 219.973 233.8155 256.30933 260.9380 272.0370  306.272   100  b 
#>  range2  72.040  75.7300  84.97079  85.1985  90.8195  108.869   100 a

我们也可以使用length(qunique(x))作为因子或整数。

关于Filter。表达

Filter(function(x) max(x) - min(x), dataset)

类似于

dataset[vapply(dataset, function(x) as.logical(max(x) - min(x)), logical(1))]

但它的工作速度有点慢。

请注意,nearZeroVar()是更复杂,更灵活的解决方案。