Как нормализовать все переменные в кадре данных R (кроме одной переменной, которая является фактором)

У меня возникают трудности с применением функции нормализации max-min к прогнозирующим переменным (30 из них) в моем фрейме данных без исключения диагностической переменной (поскольку она является фактором и не зависит от функции) из фрейма данных.

```{r}
cancer_data <- as.data.frame(lapply(cancer_data, normalize))
```

Это не запустит bc, это вызовет сообщение об ошибке, относящееся к столбцу фактора, но я не хочу, чтобы новый фрейм данных создавался без этого столбца. Я просто хотел бы применить созданную мной функцию нормализации к 30 прогнозирующим переменным.

Вот структура моего фрейма данных, если она вообще предоставляет полезный контекст:

str(cancer_data)
## 'data.frame':    569 obs. of  31 variables:
##  $ diagnosis        : Factor w/ 2 levels "Benign","Malignant": 1 1 1 1 1 1 1 2 1 1 ...
##  $ radius_mean      : num  12.3 10.6 11 11.3 15.2 ...
##  $ texture_mean     : num  12.4 18.9 16.8 13.4 13.2 ...
##  $ perimeter_mean   : num  78.8 69.3 70.9 73 97.7 ...
##  $ area_mean        : num  464 346 373 385 712 ...
##  $ smoothness_mean  : num  0.1028 0.0969 0.1077 0.1164 0.0796 ...
##  $ compactness_mean : num  0.0698 0.1147 0.078 0.1136 0.0693 ...
##  $ concavity_mean   : num  0.0399 0.0639 0.0305 0.0464 0.0339 ...
##  $ points_mean      : num  0.037 0.0264 0.0248 0.048 0.0266 ...
##  $ symmetry_mean    : num  0.196 0.192 0.171 0.177 0.172 ...
##  $ dimension_mean   : num  0.0595 0.0649 0.0634 0.0607 0.0554 ...
##  $ radius_se        : num  0.236 0.451 0.197 0.338 0.178 ...
##  $ texture_se       : num  0.666 1.197 1.387 1.343 0.412 ...
##  $ perimeter_se     : num  1.67 3.43 1.34 1.85 1.34 ...
##  $ area_se          : num  17.4 27.1 13.5 26.3 17.7 ...
##  $ smoothness_se    : num  0.00805 0.00747 0.00516 0.01127 0.00501 ...
##  $ compactness_se   : num  0.0118 0.03581 0.00936 0.03498 0.01485 ...
##  $ concavity_se     : num  0.0168 0.0335 0.0106 0.0219 0.0155 ...
##  $ points_se        : num  0.01241 0.01365 0.00748 0.01965 0.00915 ...
##  $ symmetry_se      : num  0.0192 0.035 0.0172 0.0158 0.0165 ...
##  $ dimension_se     : num  0.00225 0.00332 0.0022 0.00344 0.00177 ...
##  $ radius_worst     : num  13.5 11.9 12.4 11.9 16.2 ...
##  $ texture_worst    : num  15.6 22.9 26.4 15.8 15.7 ...
##  $ perimeter_worst  : num  87 78.3 79.9 76.5 104.5 ...
##  $ area_worst       : num  549 425 471 434 819 ...
##  $ smoothness_worst : num  0.139 0.121 0.137 0.137 0.113 ...
##  $ compactness_worst: num  0.127 0.252 0.148 0.182 0.174 ...
##  $ concavity_worst  : num  0.1242 0.1916 0.1067 0.0867 0.1362 ...
##  $ points_worst     : num  0.0939 0.0793 0.0743 0.0861 0.0818 ...
##  $ symmetry_worst   : num  0.283 0.294 0.3 0.21 0.249 ...
##  $ dimension_worst  : num  0.0677 0.0759 0.0788 0.0678 0.0677 ...


person strapped_gopherbro    schedule 16.05.2020    source источник


Ответы (2)


Предполагая, что у вас уже есть normalize функция в вашей среде. Вы можете получить числовые переменные в своих данных и применить функцию к выбранным столбцам с помощью lapply.

cols <- sapply(cancer_data, is.numeric)
cancer_data[cols] <- lapply(cancer_data[cols], normalize)

Или без создания cols.

cancer_data[] <- lapply(cancer_data, function(x) 
                       if(is.numeric(x)) normalize(x) else x)

Если вы хотите исключить только 1-й столбец, вы также можете использовать:

cancer_data[-1] <- lapply(cancer_data[-1], normalize)
person Ronak Shah    schedule 16.05.2020

Это должно работать, но посмотрите на tidymodels

Спасибо akrun за новый более короткий ответ.

library(tidyverse)

cancer_data <-cancer_data %>% mutate_if(negate(is.factor), normalize)
person Bruno    schedule 16.05.2020
comment
Можно ли сделать это компактным с помощью cancer_data %>% mutate_if(negate(is.factor), normalize) - person akrun; 16.05.2020