Отказ от категориальных переменных с большим количеством факторов

У меня есть набор данных data с 66 переменными и около 200 000 наблюдений. Снимок структуры данных отображается ниже:

$ f37: Factor w/ 10 levels "","1","10","2",..: 2 4 4 2 4 2 4 2 2 4 ...  
$ f38: Factor w/ 3509 levels "","100","1000",..: 1 1 1 1 1 1 1 1 1 1 ...  
$ f39: Factor w/ 15 levels "","1","11","14",..: 7 4 2 4 7 8 15 7 4 4 ...  
$ f40: Factor w/ 15097 levels "","0","1","100",..: 11150 1 5539 1 6710 1650 14680 9235 1 1 ...  
$ f41: num  2156 2156 2156 2156 2156 ...  
$ f42: Factor w/ 14583 levels "","'0503624",..: 11573 1 13170 1 9243 8310 607 1979 1 1 ...  
$ f43: Factor w/ 133655 levels ""," ","(BLANK)",..: 92730 1 2046 1 26944 65286 198 42956 1 1 ...  
$ f44: Factor w/ 145029 levels "","-"," "," 1A8GHB1R76Y123913",..: 49912 1 14207 1 9798 121241 31872 88345 1 1 ...  
$ f45: Factor w/ 124642 levels "","'11291331764964",..: 118266 1 108600 1 14814 3176 46466 99158 1 1 ...  
$ f46: Factor w/ 6524 levels ""," "," HOL 232",..: 85 1 1 1 207 1 1 1  `    

В данных содержится большое количество категориальных переменных. Я хотел бы исключить категориальные переменные, уровень которых превышает число, скажем, n. Это сделано не только для сокращения времени вычислений, но и для обеспечения работы определенных алгоритмов машинного обучения, таких как случайные леса.

Я пробовал следующий код:

drop_factors <- function(x){
for (j in 1:length(x[1,])) {

        if (is.factor(x[,j])) {
                if(nlevels(x[,j])>32){
                    x[,j]<-NULL
            }
        }

    }
}

Однако, когда я пытаюсь:

dropfactors(data)

Я получаю следующую ошибку:

Error in `[.data.frame`(x, , j) : undefined columns selected

Я был бы очень признателен за любую помощь?


person user3328027    schedule 19.02.2014    source источник


Ответы (2)


Вам не нужен цикл for:

data[sapply(data, nlevels) <= 32]

Вы получаете сообщение об ошибке, потому что вы изменяете количество столбцов фрейма данных во время цикла for. Следовательно, j может принимать значения, превышающие оставшееся количество столбцов.

person Sven Hohenstein    schedule 19.02.2014

вы можете сделать это для определения фактора с более чем 32 уровнями:

factor32 <- sapply(data, function(x) class(x) == "factor" & nlevels(x) > 32)
data <- data[, !factor32]

V

person Victorp    schedule 19.02.2014