Удаление всех специальных символов из целого кадра данных, но с сохранением определений уровня фактора - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь удалить специальные символы, например, "-", "/", ")", "(" et c целиком из моего фрейма данных. Однако мой фрейм данных содержит только одно наблюдение, поскольку оно подается в модель, которая будет использовать в производстве. Я определил уровни факторов явно для фрейма данных.

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

sanitize_string <- function(string){
  gsub('\\s+', "_", string) %>%
    gsub("[(]", "_", .) %>%
    gsub("[)]", "_", .) %>%
    gsub("[/]", "_", .) %>%
    gsub("[-]", "_", .)}

, а затем:

 df <- as.data.frame(lapply(df, function(dataframe) sapply(dataframe, sanitize_string)), stringsAsFactors=FALSE)

Но когда я делаю это, я теряю свои уровни факторов, он просто видит каждый фактор как имеющий один уровень, что вызывает проблемы позже, когда я пытаюсь получить прогнозы из моей модели, так как sparse.model.matrix нужно 2 или больше Уровни для каждого фактора, но на самом деле в производстве, будет отправлено только одно наблюдение.

Спасибо.

Вот мой фрейм данных:

 $ children_under16                : Factor w/ 2 levels "No","Yes": 1
 $ ft_employment_status            : Factor w/ 5 levels "Employed","Full-Time Education(Student)",..: 1
 $ fuel_type                       : Factor w/ 2 levels "D","P": 2
 $ homeowner                       : Factor w/ 2 levels "FALSE","TRUE": 2
 $ marital_status                  : Factor w/ 6 levels "Married","Separated",..: 1
 $ overnight_loc                   : Factor w/ 7 levels "In a private Driveway",..: NA
 $ usage_type                      : Factor w/ 3 levels "CLASS_1","SDPC",..: 1
 $ licence_type                    : Factor w/ 3 levels "UK","European",..: 1
 $ yad_relationship_to_policyholder: Factor w/ 8 levels "Spouse","No_YAD",..: 1
 $ A                          : Factor w/ 7 levels "1","2","5","3",..: 1
 $ B                          : Factor w/ 19 levels "C","E","Q","D",..: 1
 $ C                           : Factor w/ 63 levels "11","19","58",..: 1
 $ region                          : Factor w/ 12 levels "Yorkshire and The Humber",..: 1
 $ D                      : Factor w/ 28 levels "Semi-Detached Suburbia",..: 27
 $ E                   : Factor w/ 77 levels "Families in Terraces and Flats",..: 77
 $ F                 : Factor w/ 9 levels "Suburbanites",..: 1
 $ industry_band                   : Factor w/ 18 levels "13","14","15",..: 14
 $ occ_band_goco                   : Factor w/ 17 levels "0","1","2","3",..: 2
 $ transmission                    : Factor w/ 2 levels "A","M": 2
 $ vehicle_make                    : Factor w/ 19 levels "OTHER","AUDI",..: 1
 $ vehicle_type           : Factor w/ 17 levels "Mid Exec Saloon/Estate/Coupe",..: 1
 $ rural_urban                     : Factor w/ 19 levels "Urban major conurbation",..: 2
 $ water_company                   : Factor w/ 23 levels "Affinity Water",..: 23
 $ seats                           : Factor w/ 6 levels "-99","2","4",..: ```


1 Ответ

0 голосов
/ 13 марта 2020

Вы можете санировать levels фактора, а не столбца. Это сохранит порядок, в котором находятся уровни - хотя это создаст ошибку, если ваша дезинфекция использует два разных уровня и делает их одинаковыми. Я бы просто сделал для l oop:

for (i in 1:ncol(df)) {
  if(is.factor(df[[i]])) {
    levels(df[[i]]) = sanitize_string(levels(df[[i]]))
  }
}

Я не могу проверить это на структуре, которую вы опубликовали, но если у вас есть проблемы, пожалуйста, поделитесь некоторыми данными с dput(), чтобы я мог скопируйте / вставьте его (например, dput(df[1:10, ]) или другое небольшое подмножество, иллюстрирующее проблему), и я буду рад проверить и уточнить.

...