我一直在学习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]}