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