2016-04-03 4 views
0

У меня есть следующий dataframe называется «погода», что я пытаюсь нормализовать:NA после нормализации в R

'data.frame': 4745 obs. of 9 variables: 
$ TimeofDay : int 700 800 900 1000 1100 1200 1300 1400 1500 1600 ... 
$ AirTemp  : num 16.4 17.7 19.3 19.8 21.3 ... 
$ Humidity  : num 76.3 68.5 57.4 53.6 49.2 ... 
$ Dewpoint  : num 12.2 11.8 10.7 10.2 10.2 ... 
$ BarPres  : num 101 101 101 101 101 ... 
$ MaxWindSpeed : num 4.45 5.25 5.25 6.85 5.25 ... 
$ Zenith  : num 99 88.4 81.7 72.2 64.5 59.2 57.1 58.4 63 70.3 ... 
$ Azimuth  : num -99 119 125 135 148 ... 
$ TotalSolarRad: int 0 2 77 116 76 93 138 125 138 82 ... 

Я использую стандартную функцию нормализации следующим образом:

normalize <- function(x) { 
    return ((x - min(x))/(max(x) - min(x))) 
    } 

и применение это так:

weatherNorm <- as.data.frame(lapply(weather, normalize)) 

после нормализации новый dataframe состоит из множества значений NA, подобных этим :

'data.frame': 4745 obs. of 9 variables: 
$ TimeofDay : num NA NA NA NA NA NA NA NA NA NA ... 
$ AirTemp  : num NA NA NA NA NA NA NA NA NA NA ... 
$ Humidity  : num NA NA NA NA NA NA NA NA NA NA ... 
$ Dewpoint  : num NA NA NA NA NA NA NA NA NA NA ... 
$ BarPres  : num NA NA NA NA NA NA NA NA NA NA ... 
$ MaxWindSpeed : num NA NA NA NA NA NA NA NA NA NA ... 
$ Zenith  : num 1 0.879 0.803 0.695 0.607 ... 
$ Azimuth  : num 0 0.562 0.577 0.604 0.635 ... 
$ TotalSolarRad: num 0 0.00199 0.07669 0.11554 0.0757 ... 

Есть ли причина, по которой функция изменит значения на NA? Эта функция работает по мере необходимости на других фреймах данных.

+0

См. '? Max'. Вы хотите 'na.rm'. – MichaelChirico

+1

Опубликовать воспроизводимый пример вместо 'str' – Sotos

+1

Также я бы сделал:' r <- range (x, na.rm = TRUE); return ((x - r [1])/diff (r)) '- вы вычисляете' min' дважды – MichaelChirico

ответ

1

max() и min() необходимо использовать с na.rm = T для «пропуска» над значениями NA при расчете их соответствующего результата.

+0

, так где мне нужно добавить na.rm = T? – DataGuy

0

Проблема заключается в том, что ваш вектор содержит значения NA. Использование min() и max() для векторов, содержащих значения NA, возвращает NA. Существует необязательный параметр в min() и max(), который равен na.rm, который по умолчанию установлен в FALSE. Этот параметр, если установлено значение true, позволяет min() и max() пропускать значения NA. Таким образом, в этом случае измените свою функцию на

normalize <- function(x) { 
return ((x - min(x, na.rm = TRUE))/(max(x, na.rm = TRUE) - min(x, na.rm = TRUE)))}