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 |