Как удалить столбцы с более чем 90% значениями как '0' в R - PullRequest
0 голосов
/ 18 декабря 2018

У меня были категориальные переменные, которые я преобразовал в фиктивные переменные и получил более 2381 переменных.Мне не понадобится столько переменных для анализа (скажем, регрессии или корреляции).Я хочу удалить столбцы, если более 90% от общего значения в данном столбце равно «0».Кроме того, существует ли хорошая метрика для удаления столбцов, отличных от 90% значений, которые равны '0'?Помогите!

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Это даст вам data.frame без столбцов, где более 90% элементов составляют 0:

df[sapply(df, function(x) mean(x == 0) <= 0.9)]

Или более изящно, как предполагает Маркус:

df[colMeans(df == 0) <= 0.9]
0 голосов
/ 18 декабря 2018

Hy, я написал код с пакетом dplyr.Вот пример того, как можно избавиться от столбцов, содержащих более 90% нулей:

library(dplyr)

df <- data.frame(colA=sample(c(0,1), 100, replace=TRUE, prob=c(0.8,02)),
                 colB=sample(c(0,1), 100, replace=TRUE, prob=c(0.99,001)),
                 colC=sample(c(0,1), 100, replace=TRUE, prob=c(0.5,05)),
                 colD=sample(c(0,1), 100, replace=TRUE, prob=c(0,1)),
                 colE=rep(0, 100))

fct <- function (x) x==0

zero_count <- df %>% mutate_all(funs(fct)) %>% summarise_all(sum)

col_filter <- zero_count <= 0.9 * nrow(df)

df_filter <- df[, col_filter]
0 голосов
/ 18 декабря 2018

Это легко сделать с помощью colSums:

Пример данных:

df <- data.frame(x = c(rep(0, 9), 1),
                 y = c(rep(0,9), 1),
                 z = c(rep(0, 8), 1, 1))

> df
   x y z
1  0 0 0
2  0 0 0
3  0 0 0
4  0 0 0
5  0 0 0
6  0 0 0
7  0 0 0
8  0 0 0
9  0 0 1
10 1 1 1

df[, colSums(df == 0)/nrow(df) < .9, drop = FALSE]
   z
1  0
2  0
3  0
4  0
5  0
6  0
7  0
8  0
9  1
10 1

Что касается вопроса о полезной метрике, это сильно зависит от того, что вы хотите проанализировать.Даже столбец с более чем 90% 0 значениями может быть полезен для регрессионной модели.Я бы посмотрел на содержимое переменной или использовал бы пошаговое исключение, основанное на AIC или BIC, чтобы измерить релевантность ваших переменных.

...