在数据表中按条件删除列的最佳方法



我一直在学习R中的data.table包,并试图预处理一些数据以进行建模。

对于数据框,一个凸轮执行以下操作以删除变化很小的列和相关性强的列。

model_dat2 = final_model_dat[ , c(numeric_features)]
model_dat3 <- model_data2[,-nearZeroVar(model_data2)]
correlations <- cor(model_dat3)
highCorr <- caret::findCorrelation(correlations, cutoff=0.90, verbose=TRUE, names=FALSE)
model_dat4 <- model_dat3[, -highCorr]

我试图将这些一般步骤应用于 data.table,但它并不那么简单。

model_dat2 = final_model_dat[ , c(numeric_features), with=FALSE]
model_dat3 = Filter(var, model_dat2)
correlations <- cor(model_dat3)
highCorr <- caret::findCorrelation(correlations, cutoff=0.90, verbose=TRUE, names=FALSE)
model_dat4 <- model_dat3[, (highCorr) := NULL]

这"有效"...但我想知道按条件删除列的最佳方法是什么。此任务的 data.table 解决方案是什么样的?

如果我们想在 data.table 上使用 nearZeroVar ,获取与nearZeroVar方差接近于零的列名,并删除带有 setdiff

library(caret)
library(data.table)
data(BloodBrain)
setDT(bbbDescr)
model_dat3 <- bbbDescr[, setdiff(names(bbbDescr), 
                     nearZeroVar(bbbDescr, names = TRUE)), with = FALSE]
correlations <- cor(model_dat3)

或者用tidyverse

library(dplyr)
bbbDescr %>%
  select_at(vars(-one_of(nearZeroVar(., names = TRUE)))) %>%
  cor(.) %>%
  {i1 <- caret::findCorrelation(., cutoff=0.90, verbose=TRUE, names=FALSE)
  .[,-i1]}

相关内容

最新更新