본문 바로가기
## 오래된 게시글 (미관리) ##/R

7. airquality 데이터를 이용한 데이터변환

by #Glacier 2018. 11. 20.
반응형

안녕하세요. 오늘은 R패키지 내에 내장되어있는 

airquality 데이터를 이용하여 여러가지 데이터 변환(관리)을 해보겠습니다.


airquality는 이름만 봐도 공기질에 대한 데이터가 있겠죠? 

이 데이터는 R에 내장되어있어서 따로 패키지 설치를 할 필요가 없습니다.




data(airquality)
head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190   7.4   67     5   1
2    36     118   8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6


# data()함수로 airquality 데이터를 불러옵니다. 그럼 자동으로 불러와지는데요.

# 항상 데이터는 수많은 관측치가 있기 때문에 모두 다~ 보려면 오래걸립니다. 

  결측치는 없는지, 실수로 적힌 것은 없는지 이런것을 하나하나 다 보기에는 너무 오래걸리죠. 

  그러나 우리는 누군가가 만들어놓은 데이터가 있습니다. 

  그렇기에 우리는 모든 것을 다 볼 필요도 없고, 실질적으로 아~ 이런 데이터구나! 하고 생각할 수 있을 정도로만 

  보기도 합니다. 그런 함수가 바로 head()와 tail()입니다.


# head()함수는 default값이 6행까지 보여주는 것입니다. 위에서도 보이듯이 6행까지 보여주죠?

# head(airquality, 10) 이라고 치면, 10행까지도 보여줄 수 있습니다.

# head()함수가 맨 위부터 6행을 보여준다면 tail()함수는 영어처럼 꼬리, 즉 뒷부분에서 6행을 보여줍니다. (참고)

# 숫자가 조금 밀리는 감이 있는데, 실제로 R 내에서 따라하시면 보는데 문제 없습니다.

# 변수들은 Ozone과 Solar.R, Wind, Temp, Month, Day가 있죠.

# 우리가 실제로 길거리에서 전광판에 뜨는 오존량, 풍속 등을 기록한 것이고, day는 관측 일 수라는 것을 알 수 있습니다.


str(airquality)
'data.frame':   153 obs. of  6 variables:
 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...


# 자 저번시간에 봤던 str()함수로 한번 데이터구조를 봐 볼까요?

# 그러면 총 153개의 관측치가 있다는 것을 알려주고있고, 6개의 변수로 되어있다는 것을 알려줍니다.

# Wind는 뉴메릭형태이며 나머지는 다 integer(정수) 형태로 되어있다는 것을 알 수 있습니다.


자 그럼 이제 새로운 관측치를 넣어볼까요??




newr<-data.frame(Ozone=100, Solar.R=400, Wind=40, Temp=130, Month=10, Day=1)
newr
  Ozone Solar.R Wind Temp Month Day
1   100     400   40  130    10   1


#새로운 행인 newr (이제는 눈치 채시리라 생각합니다.. newrow의 약자로 만들어봤습니다.)를 airquality가 

 데이터 프레임이니까 동일한 형태로 만들고 똑같은 변수 이름을 지정하여서 그대로 맨 아래 행에 추가될 수 있게 만듭니다.

#10월에 지구종말이 올 것이라는 징조가 보이도록 만들어봤습니다. 오존량이 100이나되고 제가생각하기엔 Temp(온도)가   화씨기준으로 되어있는 것 같군요 화씨 130도는 인터넷에 쳐보니까.. 섭씨 54.4도정도되네요.풍속이 40이나 되며..

#이제 이 10월의 종말 징조를 airquality에 새 행으로 추가하기위해서 rbind() 함수를 씁니다. 즉 row, 행으로 묶습니다.


newair<-rbind(airquality, newr)
dim(newair)
[1] 154   6
tail(newair)
    Ozone Solar.R Wind Temp Month Day
149    30     193  6.9   70     9  26
150    NA     145 13.2   77     9  27
151    14     191 14.3   75     9  28
152    18     131  8.0   76     9  29
153    20     223 11.5   68     9  30
154   100     400 40.0  130    10   1


# 기존데이터를 보존하기위해서 새로운 변수 newair에 airquality와 제가 만든 newr를 행으로 묶어 저장하였습니다.

# 잘 되었나 보기위해서 앞서서 했었던 dim()함수를 이용해서 dim(newair)를 치면, 153개의 관측치에서 154개가 되었죠.

# 더 잘보기 위해서 아까 말했던 tail()함수를 써서 보면 잘 되어있죠~?


--- ##혹시 새로운 변수를 또 만들고 싶다면!##---
newc<-1:nrow(newair)
newair2<-cbind(newair, newc)
head(newair2)
  Ozone Solar.R Wind Temp Month Day newc
1    41     190  7.4   67     5   1    1
2    36     118  8.0   72     5   2    2
3    12     149 12.6   74     5   3    3
4    18     313 11.5   62     5   4    4
5    NA      NA 14.3   56     5   5    5
6    28      NA 14.9   66     5   6    6


# newc이라는 변수에 1:nrow(newair) 즉 newair의 1부터 n개의 행까지의 숫자까지의 (여기서는 154가 되겠죠.) 

  즉 1~154까지 생성

# newair2라는 변수에 cbind() 이것은 rbind()와 다르게 열 병합함수입니다. 즉 열로 붙여넣어줍니다.

# newair와 newc를 cbind시켜주면, 잘 되어있죠~

----##                                                   ##---


이제 airquality에 데이터를 행과 열 기준으로 병합해보았습니다. 이번엔 subset()함수를 이용해서 부분집합들을 만들어볼까요?

말그대로 조건을 부여하여 부분집합을 따로 빼서 새로운 데이터로 저장할 수 있습니다.




 # subset(dataframe, select=열이름) : 데이터셋에서 조건에 맞게 데이터 추출
summary(airquality)
     Ozone           Solar.R           Wind             Temp      
 Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
 1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
 Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
 Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
 3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
 Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
 NA's   :37       NA's   :7                                       
     Month            Day      
 Min.   :5.000   Min.   : 1.0  
 1st Qu.:6.000   1st Qu.: 8.0  
 Median :7.000   Median :16.0  
 Mean   :6.993   Mean   :15.8  
 3rd Qu.:8.000   3rd Qu.:23.0  
 Max.   :9.000   Max.   :31.0  
                               

#일단 앞서서 summary()함수에 대해서 알려드리겠습니다. summary()함수는 요약인데요,

 회귀분석이나 어디서든 summary()함수가 결과값을 세밀하게 보여주는 역할을 하고 있습니다.

 보시다시피 각 변수마다 최소값, 1분위수, 3분위수, 중위수, 평균, 최대값, NA 수까지 다 보여주고 있지요.

 NA( Not available ) 입니다.  결측이죠. 이런 것을 통해서도 데이터를 관찰해볼 수 있다는 것을 알려드립니다..


 # 1) 부분집합1 = Wind가 12.0보다 크고 Temp가 80.0보다 큰 부분집합 (AND)
subset(airquality, select=c(Ozone, Solar.R, Wind, Temp), subset=(Wind>12.0 & Temp>80.0))
    Ozone Solar.R Wind Temp
29     45     252 14.9   81
40     71     291 13.8   90
74     27     175 14.9   81
75     NA     291 14.9   91
94      9      24 13.8   81
129    32      92 15.5   84
134    44     236 14.9   81

# 2) 부분집합2 = Wind가 20.0보다 크거나 Temp가 100.0보다 큰 부분집합 (OR)
subset(airquality, select=c(Ozone, Solar.R, Wind, Temp), subset=(Wind > 20.0 | Temp> 100.0))

   Ozone Solar.R Wind Temp
9      8      19 20.1   61
48    37     284 20.7   72


#subset()함수를 통해서 &(and), | (or)의 조건을 이용해서 만들어봤습니다.


----##


자 이번에는, merge()함수를 이용하여 공통된 열을 토대로 데이터프레임끼리 병합해보겠습니다.




# merge(df1, df2, by="공통 열이름") : 2개의 데이터프레임을 공통된 열이름으로 통합

# 1) sub1 = Wind가 12.0보다 크고 Temp가 80.0보다 큰 부분집합 (AND)이며 그에 해당하는 Solar.R, Temp까지 부분집합으로 생성


sub1<-subset(airquality, select=c(Solar.R, Temp, Month, Day), subset=(Wind>12.0 & Temp>80.0))
sub1
    Solar.R Temp Month Day
29      252   81     5  29
40      291   90     6   9
74      175   81     7  13
75      291   91     7  14
94       24   81     8   2
129      92   84     9   6
134     236   81     9  11

# 2) 부분집합2 = Wind가 12.0보다 크거나 Temp가 80.0보다 큰 부분집합 (OR)이며 그에 해당하는 Ozone, Wind까지 부분집합으로 생성


sub2<-subset(airquality, select=c(Ozone, Wind, Month, Day), subset=(Wind>12.0 & Temp>80.0))
sub2
    Ozone Wind Month Day
29     45 14.9     5  29
40     71 13.8     6   9
74     27 14.9     7  13
75     NA 14.9     7  14
94      9 13.8     8   2
129    32 15.5     9   6
134    44 14.9     9  11

​#merge함수를이용하기 위해서는 자료 내용이 전체적으로 똑같진 않지만 공통된 열이 있어야 가능합니다.

 그래서 제가 공통된 Month, Day를 기준으로 Ozone과 Wind로 데이터프레임2를 만들고, Solar.R, Temp로 데이터프레임1을 만들어서

 나누었습니다. 그렇기에 서로 데이터구조는 달라도 Month와 Day는 공통되어있겠죠.

 그것을 Month와 Day변수 열을 기준으로 merge() 함수를 이용하여 합쳐보겠습니다.

# Merge함수로 Month, Day 공통변수로 하여 합친다.
air3<-merge(sub1, sub2, by=c("Month", "Day"), sort= F)
air3
  Month Day Solar.R Temp Ozone Wind
1     5  29     252   81    45 14.9
2     6   9     291   90    71 13.8
3     7  13     175   81    27 14.9
4     7  14     291   91    NA 14.9
5     8   2      24   81     9 13.8
6     9   6      92   84    32 15.5
7     9  11     236   81    44 14.9 


# 잘 합쳐진 것을 볼 수 있습니다. Month와 Day를 기준으로 두 부분집합 2개가 합쳐진 것을 볼 수 있습니다.





★ 오늘은 airquality 데이터를 이용해서 rbind(), cbind(), subset(), merge() 함수를 써봤는데요~

    한 두번 해본다고 해서 쉽진 않을 것이라고 생각합니다. 생소하기 때문이죠...!

    다음 시간에는 자료형, 데이터 구조 변환과 데이터 결측 파악에 대해서 알아보도록 하겠습니다.

반응형

'## 오래된 게시글 (미관리) ## > R' 카테고리의 다른 글

9. 통계분석의 개념  (0) 2018.11.20
+ R명령어 조금 더 알아보기  (0) 2018.11.20
6. R 행렬구조  (0) 2018.11.20
5. R 연산 연습  (0) 2018.11.20
4. R Programming 기초  (0) 2018.11.20