我有一个大的数据框,它是由我不能控制的过程生成的,其中可能包含具有零方差的变量(即所有观测值都相同)。我想基于这个数据构建一个预测模型,显然这些变量没有用处。
这是我目前正在使用的函数,用于从数据框中删除这样的变量。它目前基于apply
,我想知道是否有任何明显的方法可以加速此函数,使其在非常大的数据集上快速运行,有大量(400或500)变量?
set.seed(1)
dat <- data.frame(
A=factor(rep("X",10),levels=c('X','Y')),
B=round(runif(10)*10),
C=rep(10,10),
D=c(rep(10,9),1),
E=factor(rep("A",10)),
F=factor(rep(c("I","J"),5)),
G=c(rep(10,9),NA)
)
zeroVar <- function(data, useNA = 'ifany') {
out <- apply(data, 2, function(x) {length(table(x, useNA = useNA))})
which(out==1)
}
这是处理的结果:
> dat
A B C D E F G
1 X 3 10 10 A I 10
2 X 4 10 10 A J 10
3 X 6 10 10 A I 10
4 X 9 10 10 A J 10
5 X 2 10 10 A I 10
6 X 9 10 10 A J 10
7 X 9 10 10 A I 10
8 X 7 10 10 A J 10
9 X 6 10 10 A I 10
10 X 1 10 1 A J NA
> dat[,-zeroVar(dat)]
B D F G
1 3 10 I 10
2 4 10 J 10
3 6 10 I 10
4 9 10 J 10
5 2 10 I 10
6 9 10 J 10
7 9 10 I 10
8 7 10 J 10
9 6 10 I 10
10 1 1 J NA
> dat[,-zeroVar(dat, useNA = 'no')]
B D F
1 3 10 I
2 4 10 J
3 6 10 I
4 9 10 J
5 2 10 I
6 9 10 J
7 9 10 I
8 7 10 J
9 6 10 I
10 1 1 J
nearZeroVar()
,而这个问题就是基于该函数的。有时候我发现自己只想删除方差为零的变量,并以另一种方式处理“接近零方差”的变量(例如,将几个“接近零方差”变量合并成一个新变量)。 - ZachnearZeroVar()
函数时,设定saveMetrics = T
,那么输出便会同时显示zeroVar
(方差为0)和nzv
(接近0的方差)。通过在函数中设定其他阈值,你可以自由选择接近0方差的不同值所占比例的截断点。所以,我认为这种方法更简单灵活。 - Cherry Wu