Learning & Reasoning/R

R 데이터 cleaning

이현봉 2013. 1. 21. 01:26

R로 로딩한 데이터를 깨끗이 정리하는 연습.

앞서 로딩한 데이터를 "data"로 명명해서 햇갈리니 이름을 바꾸자.

> weatherData = data     # <- 이 귀찮을 때 = 을 써도 대부분 괜찮다.

> dim(weatherData)
[1] 20 22           # 즉 row/record/observation 이 20개이고, column/field/variable 이 22개

> class(weatherData)          
[1] "data.frame"            # weatherData는 data.frame 즉 dataset 임.

> names(weatherData)               // weatherData data.frame이 아래 22개의 variable로 구성됨
 [1] ""                                  "Date"                            
 [3] "Minimum temperature (캜)"          "Maximum temperature (캜)"        
 [5] "Rainfall (mm)"                     "Evaporation (mm)"                
 [7] "Sunshine (hours)"                  "Direction of maximum wind gust " 
 [9] "Speed of maximum wind gust (km/h)" "Time of maximum wind gust"       
[11] "9am Temperature (캜)"              "9am relative humidity (%)"       
[13] "9am cloud amount (oktas)"          "9am wind direction"              
[15] "9am wind speed (km/h)"             "9am MSL pressure (hPa)"          
[17] "3pm Temperature (캜)"              "3pm relative humidity (%)"       
[19] "3pm cloud amount (oktas)"          "3pm wind direction"              
[21] "3pm wind speed (km/h)"             "3pm MSL pressure (hPa)"

weatherData 의 variable 중 첫째 column은 이름도 없고 값도 NA이기에 삭제.  그리고 10번쨰 "Time of maximum wind gust" 역시 사용하지 않을 것이므로 삭제

> weatherData <- weatherData[-c(1, 10)]   # 첫째 variable과 10째 variable을 제외한 weatherData의 sub dataset으로 만듬.

> dim(weatherData)
[1] 20 20            # 2개의 variable 이 없어져서 이제는 variable이 20개. 
> names(weatherData)
 [1] "Date"                              "Minimum temperature (캜)"         // 앞서 "" variable이 삭제
 [3] "Maximum temperature (캜)"          "Rainfall (mm)"                   
 [5] "Evaporation (mm)"                  "Sunshine (hours)"                
 [7] "Direction of maximum wind gust "   "Speed of maximum wind gust (km/h)"
 [9] "9am Temperature (캜)"              "9am relative humidity (%)"   // 앞서 "Time of maximum wind gust" variable 삭제
[11] "9am cloud amount (oktas)"          "9am wind direction"              
[13] "9am wind speed (km/h)"             "9am MSL pressure (hPa)"          
[15] "3pm Temperature (캜)"              "3pm relative humidity (%)"       
[17] "3pm cloud amount (oktas)"          "3pm wind direction"              
[19] "3pm wind speed (km/h)"             "3pm MSL pressure (hPa)"

weatherData 의 20개 variable명이 길고 외우기 힘들어 짧고 쉬운 것으로 variable 명을 바꿈

> easyNames = c("Date", "MinTemp", "MaxTemp",
+ "Rainfall", "Evaporation", "Sunshine",
+ "WindGustDir", "WindGustSpeed", "Temp9am",
+ "Humidity9am", "Cloud9am", "WindDir9am",
+ "WindSpeed9am", "Pressure9am", "Temp3pm",
+ "Humidity3pm", "Cloud3pm", "WindDir3pm",
+ "WindSpeed3pm", "Pressure3pm")

> length(easyNames)    // easyNames는 vector이므로 length로 element 개수를 파악.  data.frame의 variable도 vector
[1] 20    

> names(weatherData) <- easyNames

> names(weatherData)
 [1] "Date"          "MinTemp"       "MaxTemp"       "Rainfall"      "Evaporation"   "Sunshine"    
 [7] "WindGustDir"   "WindGustSpeed" "Temp9am"       "Humidity9am"   "Cloud9am"      "WindDir9am"  
[13] "WindSpeed9am"  "Pressure9am"   "Temp3pm"       "Humidity3pm"   "Cloud3pm"      "WindDir3pm"  
[19] "WindSpeed3pm"  "Pressure3pm"

weatherData 내용이 대충 어떤지 첫 6개의 observation/row만 보자

> head(weatherData) 


weatherData의 variable들이 어떤 class 타입인지 알아보자

weatherData 내에 NA가 몇개나 있을까?

> sum(is.na(weatherData))    #   is.na(weatherData) : weatherData 내에 element가 NA 인 것을 TRUE로.  아니면 FALSE  
[1] 44                                  #   sum은 TRUE를 1, FALSE를 0으로 카운트

weatherData 내에 WindGustDir variable을 보니 빈 칸("" ; emptry string)이 보임.  이런 것들을 NA로 바꿈.  NA로 되어 있으면 나중에 찾기도 쉽고, 통계/계산을 할 때 제외시키기도 쉬움. 

> weatherData[weatherData == ""]    // weatherData내에 ""이 몇개나 있는지 해보니 다음과 같은 결과
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA "" "" "" "" NA NA NA NA NA NA
[36] NA NA NA NA NA NA NA NA NA NA NA NA NA        # NA는 비교가 안되니 그대로 NA가 나옴.  조심

> sum(weatherData == "" & !is.na(weatherData))           # weatherData 내에 빈칸 ("")이 몇개인지?
[1] 4                                                                        # 4개

빈칸에 NA를 넣자.

> weatherData[weatherData == "" & !is.na(weatherData)] <- NA

> sum(is.na(weatherData))
[1] 48                                                                          # 원래 44개에서 4개 증가해 48개.

# 특정 variable(예, MinTemp)에 NA가 있는지 보고, NA가 있는 row를 제외한 data frame을 만드려면

> weatherData[-which(is.na(weatherData$MinTemp)), ]

# data frame에서 각 row별 NA가 몇 개씩 있나 보려면

apply(weatherData,1,function(x) sum(is.na(x)))  # 물론 sum(!is.na(x))로 하면 NA가 아닌 것을 count

# 어느 row가 NA를 갖고 있고, 또 그렇다면 해당 row에 몇 개의 NA가 있는지 볼 수 있으면 좋겠다. ;

apply( is.na( weather[which(!complete.cases(weather)),] ),   1,    sum)  # function으로 만들 수도 있지만 ...

위의 apply()에서 두번 째 argument를 2 로 하여 column별로 다양하게 NA나 특정 값을 index하거나 그를 기반으로 데이터 조작을 할 수 있겠다.

보다 다양하게 NA를 정리하는 방법은 "Data Mining with R : learning with case studies" 의 챕터 2.5 를 참조.




'Learning & Reasoning > R ' 카테고리의 다른 글

AdaBoost  (0) 2013.02.01
random forest  (0) 2013.01.28
rpart 패키지를 이용해 decision tree 만들기  (0) 2013.01.25
연습할 데이터 만들기  (0) 2013.01.19
Machine Learning과 데이터마이닝을 조금 더 심각하게...  (0) 2013.01.19