gpt4 book ai didi

r - 从 data.frame 中快速删除零方差变量

转载 作者:行者123 更新时间:2023-12-03 11:05:37 27 4
gpt4 key购买 nike

我有一个由我无法控制的过程生成的大型 data.frame,它可能包含也可能不包含零方差变量(即所有观察结果都相同)。我想根据这些数据建立一个预测模型,显然这些变量没有用。

这是我目前用于从 data.frame 中删除此类变量的函数。它目前基于 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

最佳答案

不要使用 table() - 这种事情很慢。一种选择是 length(unique(x)) :

foo <- function(dat) {
out <- lapply(dat, function(x) length(unique(x)))
want <- which(!out > 1)
unlist(want)
}

system.time(replicate(1000, zeroVar(dat)))
system.time(replicate(1000, foo(dat)))

在示例数据集上,这比您的速度快一个数量级,同时提供类似的输出:
> system.time(replicate(1000, zeroVar(dat)))
user system elapsed
3.334 0.000 3.335
> system.time(replicate(1000, foo(dat)))
user system elapsed
0.324 0.000 0.324

在此示例中,Simon 的解决方案同样快速:
> system.time(replicate(1000, which(!unlist(lapply(dat, 
+ function(x) 0 == var(if (is.factor(x)) as.integer(x) else x))))))
user system elapsed
0.392 0.000 0.395

但你必须看看它们是否与实际问题的规模相似。

关于r - 从 data.frame 中快速删除零方差变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8805298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com