排除R中方差为零的变量的最快方法

wqsoz72f  于 2023-04-09  发布在  其他
关注(0)|答案(3)|浏览(353)

我正在使用一个非常巨大的.csv数据集进行评估,但我有这个错误要解决。

Warning in preProcess.default(data, method = c("center", "scale")) :
  These variables have zero variances: num_outbound_cmds, is_host_login
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

排除数据集whose variance is zero (0)中变量的最快方法是什么?

nbnkbykc

nbnkbykc1#

R包caret有一个函数nearZeroVar,它可以很好地识别矩阵或数据框中方差为零或接近零的列,它将索引作为向量返回,可以使用该向量删除这些列。

> df <- data.frame(a=1:5, b=sample(1:5), c=rep(1,5))
> df
  a b c
1 1 4 1
2 2 2 1
3 3 1 1
4 4 5 1
5 5 3 1
> nearZeroVar(df)
[1] 3
> df[,-nearZeroVar(df)]
  a b
1 1 4
2 2 2
3 3 1
4 4 5
5 5 3
moiiocjp

moiiocjp2#

使用@Dthal的示例,base R选项将使用Filter

Filter(var, df)
#  a b
#1 1 4
#2 2 2
#3 3 1
#4 4 5
#5 5 3

上面的工作原理是将0的方差转换为FALSE,将所有其他值转换为TRUE,并将Filter仅转换为返回TRUE的列。
如果有NA(不使用任何外部软件包)

Filter(\(x) var(x, na.rm = TRUE), df)
  a  c
1 1  1
2 2  2
3 3 NA
4 4  3
5 5  4
bz4sfanl

bz4sfanl3#

如果你的目标是

  • 不调用任何额外的软件包,以及
  • 你依赖于tidyverse,并且
  • 如果您想考虑NA值,可以执行以下操作
library(dplyr)
df <- data.frame(
  a = seq(5), 
  b = c(NA, rep(1, 4)), 
  c = c(1, 2, NA, 3, 4),
  d = rep(1, 5)
)
df
#   a  b  c d
# 1 1 NA  1 1
# 2 2  1  2 1
# 3 3  1 NA 1
# 4 4  1  3 1
# 5 5  1  4 1

Filter(
  function(x) case_when(
    all(is.na(x)) ~ FALSE,
    !all(is.na(x)) & var(x, na.rm = TRUE) == 0 ~ FALSE,
    TRUE ~ TRUE
  ), 
  df
)
#   a  c
# 1 1  1
# 2 2  2
# 3 3 NA
# 4 4  3
# 5 5  4

这将仅在移除NA之后计算方差。
如果你也想保留b列,也就是说,把NA也看作是变量的一部分,你可以用any替换掉all,然后执行

Filter(
    function(x) case_when(
        all(is.na(x)) ~ FALSE,
        !any(is.na(x)) & var(x, na.rm = TRUE) == 0 ~ FALSE,
        TRUE ~ TRUE
    ), 
    df
)
#   a  b  c
# 1 1 NA  1
# 2 2  1  2
# 3 3  1 NA
# 4 4  1  3
# 5 5  1  4

相关问题