Rstudio 다운로드 페이지
notepad++ 다운로드 페이지
Rstudio 실행화면
setwd("D:/HUFS/Workspace/Rclass/CC_2023//")
co2 자료 구성
co2 자료 구성
텍스트 데이터
argument | 설명 |
---|---|
file | R에서 읽어올 외부 데이터가 있는 파일의 위치(경로)와 파일명(확장자 포함)을 문자형으로 지정한다. |
header | 논리형으로 TRUE를 지정하면 외부 데이터에 있는 변수명을 R 데이터에서도 동일하게 사용하며, FALSE를 지정하면 외부 데이터의 변수명을 사용하지 않고 R에서 자체적으로 변수명을 지정한다. 그 이름은 “V1”, “V2” 식으로 된다. |
sep | 구분자로 문자형 형태로 지정한다. 공백이면 ” “, 콤마이면”,“, 탭이면”\t” |
stringsAsFactors | 문자형 데이터를 요인(factor)으로 자동으로 변경할 지를 설정한다. FALSE를 지정하면 문자형 데이터를 요인으로 변경하지 않고 문자형으로 읽어들인다. |
na.strings | 데이터에 결측치가 있거나 결측치로 지정할 내용을 문자형으로 지정한다 |
nrow | 읽어들일 행의 갯수를 지정 |
skip | 읽지 않고 넘길 행의 갯수 |
fileEncoding | encoding 타입 윈도우는 WINDOWS-1252, 리눅스/맥은 UTF-8 |
co2 = read.table(file = "co2_tap_surface-flask_2_3001-9999_monthly.txt", skip = 209, header = F)
head(co2)
## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17
## 1 TAP 1990 11 1 0 0 0 -999 -9 -9 -9 -9 -9 360.79 -999.999 -9 36.73
## 2 TAP 1990 12 1 0 0 0 -999 -9 -9 -9 -9 -9 361.32 -999.999 -9 36.73
## 3 TAP 1991 1 1 0 0 0 -999 -9 -9 -9 -9 -9 362.87 -999.999 -9 36.73
## 4 TAP 1991 2 1 0 0 0 -999 -9 -9 -9 -9 -9 364.76 -999.999 -9 36.73
## 5 TAP 1991 3 1 0 0 0 -999 -9 -9 -9 -9 -9 364.85 -999.999 -9 36.73
## 6 TAP 1991 4 1 0 0 0 -999 -9 -9 -9 -9 -9 364.25 -999.999 -9 36.73
## V18 V19 V20 V21 V22 V23 V24 V25 V26 V27
## 1 126.13 -999.999 20 -999.999 -999.999 -999.999 1 -9 -9 158
## 2 126.13 -999.999 20 -999.999 -999.999 -999.999 1 -9 -9 158
## 3 126.13 -999.999 20 -999.999 -999.999 -999.999 1 -9 -9 158
## 4 126.13 -999.999 20 -999.999 -999.999 -999.999 1 -9 -9 158
## 5 126.13 -999.999 20 -999.999 -999.999 -999.999 1 -9 -9 158
## 6 126.13 -999.999 20 -999.999 -999.999 -999.999 1 -9 -9 158
colnames(co2) = c("site_gaw_id", "year", "month", "day", "hour", "minute", "second", "year1", "month1", "day1", "hour1", "minute1", "second1", "value", "value_unc", "nvalue", "latitude", "longitude", "altitude", "elevation", "intake_height", "flask_no", "ORG_QCflag", "QCflag", "instrument", "measurement_method", "scale")
head(co2)
## site_gaw_id year month day hour minute second year1 month1 day1 hour1 minute1
## 1 TAP 1990 11 1 0 0 0 -999 -9 -9 -9 -9
## 2 TAP 1990 12 1 0 0 0 -999 -9 -9 -9 -9
## 3 TAP 1991 1 1 0 0 0 -999 -9 -9 -9 -9
## 4 TAP 1991 2 1 0 0 0 -999 -9 -9 -9 -9
## 5 TAP 1991 3 1 0 0 0 -999 -9 -9 -9 -9
## 6 TAP 1991 4 1 0 0 0 -999 -9 -9 -9 -9
## second1 value value_unc nvalue latitude longitude altitude elevation
## 1 -9 360.79 -999.999 -9 36.73 126.13 -999.999 20
## 2 -9 361.32 -999.999 -9 36.73 126.13 -999.999 20
## 3 -9 362.87 -999.999 -9 36.73 126.13 -999.999 20
## 4 -9 364.76 -999.999 -9 36.73 126.13 -999.999 20
## 5 -9 364.85 -999.999 -9 36.73 126.13 -999.999 20
## 6 -9 364.25 -999.999 -9 36.73 126.13 -999.999 20
## intake_height flask_no ORG_QCflag QCflag instrument measurement_method scale
## 1 -999.999 -999.999 -999.999 1 -9 -9 158
## 2 -999.999 -999.999 -999.999 1 -9 -9 158
## 3 -999.999 -999.999 -999.999 1 -9 -9 158
## 4 -999.999 -999.999 -999.999 1 -9 -9 158
## 5 -999.999 -999.999 -999.999 1 -9 -9 158
## 6 -999.999 -999.999 -999.999 1 -9 -9 158
str(co2)
## 'data.frame': 372 obs. of 27 variables:
## $ site_gaw_id : chr "TAP" "TAP" "TAP" "TAP" ...
## $ year : int 1990 1990 1991 1991 1991 1991 1991 1991 1991 1991 ...
## $ month : int 11 12 1 2 3 4 5 6 7 8 ...
## $ day : int 1 1 1 1 1 1 1 1 1 1 ...
## $ hour : int 0 0 0 0 0 0 0 0 0 0 ...
## $ minute : int 0 0 0 0 0 0 0 0 0 0 ...
## $ second : int 0 0 0 0 0 0 0 0 0 0 ...
## $ year1 : int -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 ...
## $ month1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ day1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ hour1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ minute1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ second1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ value : num 361 361 363 365 365 ...
## $ value_unc : num -1000 -1000 -1000 -1000 -1000 ...
## $ nvalue : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ latitude : num 36.7 36.7 36.7 36.7 36.7 ...
## $ longitude : num 126 126 126 126 126 ...
## $ altitude : num -1000 -1000 -1000 -1000 -1000 ...
## $ elevation : int 20 20 20 20 20 20 20 20 20 20 ...
## $ intake_height : num -1000 -1000 -1000 -1000 -1000 ...
## $ flask_no : num -1000 -1000 -1000 -1000 -1000 ...
## $ ORG_QCflag : num -1000 -1000 -1000 -1000 -1000 ...
## $ QCflag : int 1 1 1 1 1 1 1 1 1 1 ...
## $ instrument : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ measurement_method: int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ scale : int 158 158 158 158 158 158 158 158 158 158 ...
co2 = co2[ , c("site_gaw_id", "year", "month", "day", "hour", "minute", "second","value", "QCflag", "scale")]
head(co2)
## site_gaw_id year month day hour minute second value QCflag scale
## 1 TAP 1990 11 1 0 0 0 360.79 1 158
## 2 TAP 1990 12 1 0 0 0 361.32 1 158
## 3 TAP 1991 1 1 0 0 0 362.87 1 158
## 4 TAP 1991 2 1 0 0 0 364.76 1 158
## 5 TAP 1991 3 1 0 0 0 364.85 1 158
## 6 TAP 1991 4 1 0 0 0 364.25 1 158
plot(co2$value)
plot(co2$value, type = "l")
plot(co2$value, type = "b")
plot(co2$value, type = "l", col = "red")
plot(co2$value, type = "l", col = "red", lty = 2)
plot(co2$value, type = "l", col = "red", lty = 2, lwd = 2)
argument | 설명 |
---|---|
x | 저장할 데이터 프레임 |
file | 저장할 파일명 |
append | 기존 파일 뒤에 병합하여 저장하는 옵션, 논리형 (T 또는 F) |
sep | 각 열의 구분자 (seperator) |
row.names | 행 이름 (주로 NA로 지정) |
col.names | 열 이름 (주로 지정하지 않음) |
fileEncoding | 파일 encoding 형식 (주로 지정하지 않음) |
write.csv(file = "tap_co2.csv", co2, row.names = F) # 행번호를 없애기 위해 F를 씀.
install.packages("lubridate")
library("lubridate")
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
co2 = read.csv(file = "tap_co2.csv", header = T) # 행번호를 없애기 위해 F를 씀.
함수명 | 설명 | 입력내용 | 결과 내용 |
---|---|---|---|
paste | 지정해 준 구분자 (seperator; sep = “?”)를 이용하여 문자를 합침. 지정안하면 공백 | paste(3, 4) | “3 4” |
paste0 | 구분자 없이 문자를 합침 | paste0(3, 4) | “34” |
co2$Date = paste(co2$year, co2$month, co2$day, sep = "-")
co2$Date[1:10]
## [1] "1990-11-1" "1990-12-1" "1991-1-1" "1991-2-1" "1991-3-1" "1991-4-1"
## [7] "1991-5-1" "1991-6-1" "1991-7-1" "1991-8-1"
argument | 설명 |
---|---|
x | 날짜 형식으로 읽을 변수 |
tz | 시간대, 지정안하면 GMT (UTC) |
co2$Date = as.POSIXct(co2$Date, tz = "Asia/Seoul")
co2$Date[1:10]
## [1] "1990-11-01 KST" "1990-12-01 KST" "1991-01-01 KST" "1991-02-01 KST"
## [5] "1991-03-01 KST" "1991-04-01 KST" "1991-05-01 KST" "1991-06-01 KST"
## [9] "1991-07-01 KST" "1991-08-01 KST"
plot(co2$value ~ co2$Date, ylab = "CO2 (ppm)", xlab = "Year", type = "l", col = "darkorange")
points(co2$value ~ co2$Date, col = "darkorange", pch = 15, cex = 0.5)
argument | 설명 |
---|---|
x | 계산할 항목, 1개 혹은 그 이상도 가능 |
by | 그룹화 할 항목 |
format | 날짜 형식에서 원하는 형식 추출 (%Y, %m, %d, %H, %M, %S, %w |
FUN | 계산할 함수 (mean, sum, min, max, sd) |
na.rm | not available 자료 취급 방법 (계산시 제거하려면 T) |
DAT = aggregate(co2$value, by = list(format(co2$Date, "%Y")), FUN = mean, na.rm = T)
DAT
## Group.1 x
## 1 1990 361.0550
## 2 1991 360.1542
## 3 1992 360.9367
## 4 1993 360.9033
## 5 1994 361.4808
## 6 1995 364.3700
## 7 1996 366.7417
## 8 1997 367.3242
## 9 1998 370.9333
## 10 1999 372.0475
## 11 2000 373.5692
## 12 2001 375.8825
## 13 2002 377.9625
## 14 2003 379.6200
## 15 2004 381.6567
## 16 2005 383.5620
## 17 2006 387.0350
## 18 2007 389.9058
## 19 2008 392.2200
## 20 2009 390.4392
## 21 2010 396.3575
## 22 2011 398.4542
## 23 2012 401.4908
## 24 2013 405.0858
## 25 2014 405.9192
## 26 2015 409.5167
## 27 2016 412.4875
## 28 2017 414.6800
## 29 2018 414.6875
## 30 2019 418.8958
## 31 2020 421.4425
## 32 2021 424.4608
plot(DAT[,2] ~ DAT[,1], type = "b", lwd = 2, ylab = "CO2 (ppm)", xlab = "Year")
#### > 계절적인 변화를 배제하고 순수한 트렌드만 보고 싶다면, 아래와
같이 자료를 처리함. #### ts() 함수를 사용하여 시계열 자료로 변환해줌. |
argument | 설명| |:—| :———————– | |data | 시계열화할 항목| |start |
데이터 수집이 시작된 날짜, c(1990, 11)| |end | 데이터 수집이 종료된 날짜
(필수는 아님)| |frequency | 1년 중 시료를 채취한 빈도, 메일 (365), 매월
(12), 혹은 매분기 (4)|
co2_ts = ts(co2$value, frequency = 12, start = c(1990,11))
plot.ts(co2_ts)
de_co2_ts = decompose(co2_ts)
de_co2_ts$seasonal
## Jan Feb Mar Apr May Jun
## 1990
## 1991 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1992 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1993 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1994 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1995 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1996 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1997 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1998 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 1999 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2000 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2001 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2002 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2003 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2004 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2005 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2006 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2007 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2008 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2009 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2010 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2011 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2012 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2013 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2014 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2015 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2016 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2017 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2018 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2019 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2020 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## 2021 4.2060451 4.9366146 4.6485451 2.4326701 -0.7606354 -4.4716910
## Jul Aug Sep Oct Nov Dec
## 1990 1.4102257 2.9826285
## 1991 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1992 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1993 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1994 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1995 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1996 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1997 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1998 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 1999 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2000 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2001 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2002 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2003 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2004 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2005 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2006 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2007 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2008 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2009 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2010 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2011 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2012 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2013 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2014 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2015 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2016 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2017 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2018 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2019 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2020 -5.8867326 -5.2423021 -3.5610799 -0.6942882 1.4102257 2.9826285
## 2021 -5.8867326 -5.2423021 -3.5610799 -0.6942882
plot(de_co2_ts)
argument | 설명 |
---|---|
filename | 저장할 파일 이름 |
height | 그림의 폭 |
units | 그림의 높이 |
frequency | 1년 중 시료를 채취한 빈도, 메일 (365), 매월 (12), 혹은 매분기 (4) |
res | 해상도. 보통 200 이상의 값을 사용. 높을 수록 높은 품질 |
pointsize | 심볼의 크기 |
bg | 배경색 |
{
png(filename = "deseasonal_co2.png", width = 6, height = 8, units = "in", res = 200) # 저장할 스케치북 열기
plot(de_co2_ts, col = "darkorange")
dev.off() # 스케치북 닫기
} # (7): (6) 그래프 저장
## png
## 2
setwd("D:/HUFS/Workspace/Rclass/CC_2023/")
co2 = read.table(file = "co2_amy_surface-insitu_39_9999-9999_hourly.txt", skip = 214, header = F, na.strings = "-999.999")
head(co2)
## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
## 1 AMY 1999 1 1 0 0 0 -999 -9 -9 -9 -9 -9 NA NA -9 36.5386 126.33
## 2 AMY 1999 1 1 1 0 0 -999 -9 -9 -9 -9 -9 NA NA -9 36.5386 126.33
## 3 AMY 1999 1 1 2 0 0 -999 -9 -9 -9 -9 -9 NA NA -9 36.5386 126.33
## 4 AMY 1999 1 1 3 0 0 -999 -9 -9 -9 -9 -9 NA NA -9 36.5386 126.33
## 5 AMY 1999 1 1 4 0 0 -999 -9 -9 -9 -9 -9 NA NA -9 36.5386 126.33
## 6 AMY 1999 1 1 5 0 0 -999 -9 -9 -9 -9 -9 NA NA -9 36.5386 126.33
## V19 V20 V21 V22 V23 V24 V25 V26 V27
## 1 108 42 66 NA NA 3 1 9 90
## 2 108 42 66 NA NA 3 1 9 90
## 3 108 42 66 NA NA 3 1 9 90
## 4 108 42 66 NA NA 3 1 9 90
## 5 108 42 66 NA NA 3 1 9 90
## 6 108 42 66 NA NA 3 1 9 90
colnames(co2) = c("site_gaw_id", "year", "month", "day", "hour", "minute", "second", "year1", "month1", "day1", "hour1", "minute1", "second1", "value", "value_unc", "nvalue", "latitude", "longitude", "altitude", "elevation", "intake_height", "flask_no", "ORG_QCflag", "QCflag", "instrument", "measurement_method", "scale")
head(co2)
## site_gaw_id year month day hour minute second year1 month1 day1 hour1 minute1
## 1 AMY 1999 1 1 0 0 0 -999 -9 -9 -9 -9
## 2 AMY 1999 1 1 1 0 0 -999 -9 -9 -9 -9
## 3 AMY 1999 1 1 2 0 0 -999 -9 -9 -9 -9
## 4 AMY 1999 1 1 3 0 0 -999 -9 -9 -9 -9
## 5 AMY 1999 1 1 4 0 0 -999 -9 -9 -9 -9
## 6 AMY 1999 1 1 5 0 0 -999 -9 -9 -9 -9
## second1 value value_unc nvalue latitude longitude altitude elevation
## 1 -9 NA NA -9 36.5386 126.33 108 42
## 2 -9 NA NA -9 36.5386 126.33 108 42
## 3 -9 NA NA -9 36.5386 126.33 108 42
## 4 -9 NA NA -9 36.5386 126.33 108 42
## 5 -9 NA NA -9 36.5386 126.33 108 42
## 6 -9 NA NA -9 36.5386 126.33 108 42
## intake_height flask_no ORG_QCflag QCflag instrument measurement_method scale
## 1 66 NA NA 3 1 9 90
## 2 66 NA NA 3 1 9 90
## 3 66 NA NA 3 1 9 90
## 4 66 NA NA 3 1 9 90
## 5 66 NA NA 3 1 9 90
## 6 66 NA NA 3 1 9 90
str(co2)
## 'data.frame': 204984 obs. of 27 variables:
## $ site_gaw_id : chr "AMY" "AMY" "AMY" "AMY" ...
## $ year : int 1999 1999 1999 1999 1999 1999 1999 1999 1999 1999 ...
## $ month : int 1 1 1 1 1 1 1 1 1 1 ...
## $ day : int 1 1 1 1 1 1 1 1 1 1 ...
## $ hour : int 0 1 2 3 4 5 6 7 8 9 ...
## $ minute : int 0 0 0 0 0 0 0 0 0 0 ...
## $ second : int 0 0 0 0 0 0 0 0 0 0 ...
## $ year1 : int -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 ...
## $ month1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ day1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ hour1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ minute1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ second1 : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ value : num NA NA NA NA NA NA NA NA NA NA ...
## $ value_unc : num NA NA NA NA NA NA NA NA NA NA ...
## $ nvalue : int -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 ...
## $ latitude : num 36.5 36.5 36.5 36.5 36.5 ...
## $ longitude : num 126 126 126 126 126 ...
## $ altitude : int 108 108 108 108 108 108 108 108 108 108 ...
## $ elevation : int 42 42 42 42 42 42 42 42 42 42 ...
## $ intake_height : int 66 66 66 66 66 66 66 66 66 66 ...
## $ flask_no : logi NA NA NA NA NA NA ...
## $ ORG_QCflag : logi NA NA NA NA NA NA ...
## $ QCflag : int 3 3 3 3 3 3 3 3 3 3 ...
## $ instrument : int 1 1 1 1 1 1 1 1 1 1 ...
## $ measurement_method: int 9 9 9 9 9 9 9 9 9 9 ...
## $ scale : int 90 90 90 90 90 90 90 90 90 90 ...
co2 = co2[ , c("site_gaw_id", "year", "month", "day", "hour", "minute", "second","value", "QCflag", "scale")]
head(co2)
## site_gaw_id year month day hour minute second value QCflag scale
## 1 AMY 1999 1 1 0 0 0 NA 3 90
## 2 AMY 1999 1 1 1 0 0 NA 3 90
## 3 AMY 1999 1 1 2 0 0 NA 3 90
## 4 AMY 1999 1 1 3 0 0 NA 3 90
## 5 AMY 1999 1 1 4 0 0 NA 3 90
## 6 AMY 1999 1 1 5 0 0 NA 3 90
co2$Time = paste(paste(co2$year, co2$month, co2$day, sep = "-"), paste(co2$hour, co2$minute, co2$second, sep = ":"))
co2$Time[1:10]
## [1] "1999-1-1 0:0:0" "1999-1-1 1:0:0" "1999-1-1 2:0:0" "1999-1-1 3:0:0"
## [5] "1999-1-1 4:0:0" "1999-1-1 5:0:0" "1999-1-1 6:0:0" "1999-1-1 7:0:0"
## [9] "1999-1-1 8:0:0" "1999-1-1 9:0:0"
co2$Time = as.POSIXct(co2$Time, tz = "Asia/Seoul")
co2$Time[1:10]
## [1] "1999-01-01 00:00:00 KST" "1999-01-01 01:00:00 KST"
## [3] "1999-01-01 02:00:00 KST" "1999-01-01 03:00:00 KST"
## [5] "1999-01-01 04:00:00 KST" "1999-01-01 05:00:00 KST"
## [7] "1999-01-01 06:00:00 KST" "1999-01-01 07:00:00 KST"
## [9] "1999-01-01 08:00:00 KST" "1999-01-01 09:00:00 KST"
met = read.table(file = "co2_amy_surface-insitu_39_9999-9999_hourly_met.txt", skip = 140, header = F, na.strings = c("-9999.9", "-99.9", "-999.9", "-999.999"))
colnames(met) = c("site_gaw_id", "year", "month", "day", "hour", "minute", "second", "wind_direction", "wind_speed", "relative_humidity", "precipitation_amount", "air_pressure", "air_temperature", "dew_point_temperature", "sea_water_temperature", "sea_surface_water_temperature", "sea_water_salinity", "sea_surface_water_salinity", "latitude", "longitude", "altitude", "elevation")
str(met)
## 'data.frame': 181810 obs. of 22 variables:
## $ site_gaw_id : chr "AMY" "AMY" "AMY" "AMY" ...
## $ year : int 1999 1999 1999 1999 1999 1999 1999 1999 1999 1999 ...
## $ month : int 3 3 3 3 3 3 3 3 3 3 ...
## $ day : int 29 29 29 29 29 29 29 29 30 30 ...
## $ hour : int 16 17 18 19 20 21 22 23 0 1 ...
## $ minute : int 0 0 0 0 0 0 0 0 0 0 ...
## $ second : int 0 0 0 0 0 0 0 0 0 0 ...
## $ wind_direction : num NA NA 25.8 25.7 41.7 34.8 36.5 37 47.1 70.3 ...
## $ wind_speed : num NA NA 1.6 0.5 0.3 1.9 1.1 1.4 2 1.1 ...
## $ relative_humidity : logi NA NA NA NA NA NA ...
## $ precipitation_amount : logi NA NA NA NA NA NA ...
## $ air_pressure : logi NA NA NA NA NA NA ...
## $ air_temperature : logi NA NA NA NA NA NA ...
## $ dew_point_temperature : logi NA NA NA NA NA NA ...
## $ sea_water_temperature : logi NA NA NA NA NA NA ...
## $ sea_surface_water_temperature: logi NA NA NA NA NA NA ...
## $ sea_water_salinity : logi NA NA NA NA NA NA ...
## $ sea_surface_water_salinity : logi NA NA NA NA NA NA ...
## $ latitude : num 36.5 36.5 36.5 36.5 36.5 ...
## $ longitude : num 126 126 126 126 126 ...
## $ altitude : logi NA NA NA NA NA NA ...
## $ elevation : int 42 42 42 42 42 42 42 42 42 42 ...
met = met[ , c("site_gaw_id", "year", "month", "day", "hour", "minute", "second","wind_direction", "wind_speed")]
head(co2)
## site_gaw_id year month day hour minute second value QCflag scale
## 1 AMY 1999 1 1 0 0 0 NA 3 90
## 2 AMY 1999 1 1 1 0 0 NA 3 90
## 3 AMY 1999 1 1 2 0 0 NA 3 90
## 4 AMY 1999 1 1 3 0 0 NA 3 90
## 5 AMY 1999 1 1 4 0 0 NA 3 90
## 6 AMY 1999 1 1 5 0 0 NA 3 90
## Time
## 1 1999-01-01 00:00:00
## 2 1999-01-01 01:00:00
## 3 1999-01-01 02:00:00
## 4 1999-01-01 03:00:00
## 5 1999-01-01 04:00:00
## 6 1999-01-01 05:00:00
met$Time = paste(paste(met$year, met$month, met$day, sep = "-"), paste(met$hour, met$minute, met$second, sep = ":"))
met$Time = as.POSIXct(met$Time, tz = "Asia/Seoul")
met$Time[1:10]
## [1] "1999-03-29 16:00:00 KST" "1999-03-29 17:00:00 KST"
## [3] "1999-03-29 18:00:00 KST" "1999-03-29 19:00:00 KST"
## [5] "1999-03-29 20:00:00 KST" "1999-03-29 21:00:00 KST"
## [7] "1999-03-29 22:00:00 KST" "1999-03-29 23:00:00 KST"
## [9] "1999-03-30 00:00:00 KST" "1999-03-30 01:00:00 KST"
nrow(co2); nrow(met)
## [1] 204984
## [1] 181810
argument | 설명 |
---|---|
x, y | 합칠 데이터 프레임 두 개 |
by | 합칠 기준이되는 컬럼 이름. 지금이라면 “Time |
all | 모든 자료 다 합침 |
all.x | x 데이터 기준 모든 자료 다 합침 |
all.y | y 데이터 기준 모든 자료 다 합침 |
co2.met = merge(co2, met, by = "Time")
head(co2.met)
## Time site_gaw_id.x year.x month.x day.x hour.x minute.x
## 1 1999-03-29 16:00:00 AMY 1999 3 29 16 0
## 2 1999-03-29 17:00:00 AMY 1999 3 29 17 0
## 3 1999-03-29 18:00:00 AMY 1999 3 29 18 0
## 4 1999-03-29 19:00:00 AMY 1999 3 29 19 0
## 5 1999-03-29 20:00:00 AMY 1999 3 29 20 0
## 6 1999-03-29 21:00:00 AMY 1999 3 29 21 0
## second.x value QCflag scale site_gaw_id.y year.y month.y day.y hour.y
## 1 0 382.01 2 90 AMY 1999 3 29 16
## 2 0 383.47 2 90 AMY 1999 3 29 17
## 3 0 386.09 2 90 AMY 1999 3 29 18
## 4 0 NA 3 90 AMY 1999 3 29 19
## 5 0 384.64 2 90 AMY 1999 3 29 20
## 6 0 385.10 2 90 AMY 1999 3 29 21
## minute.y second.y wind_direction wind_speed
## 1 0 0 NA NA
## 2 0 0 NA NA
## 3 0 0 25.8 1.6
## 4 0 0 25.7 0.5
## 5 0 0 41.7 0.3
## 6 0 0 34.8 1.9
co2.met = merge(co2[,c("Time", "value")], met[,c("Time", "wind_direction", "wind_speed")], by = "Time")
write.csv(file = "AMY_co2_met.csv", co2.met, row.names = F)
install.packages("openair")
library("lubridate")
library("openair")
setwd("D:/HUFS/Workspace/Rclass/CC_2023/")
co2.met = read.csv(file = "AMY_co2_met.csv", header = T)
co2.met$date = as.POSIXct(co2.met$Time, tz = "Asia/Seoul") #연, 월, 일을 인식시켜줌으로써 손쉽게 시간형태로 변경
summaryPlot(co2.met) # 안면의 summary plot
summaryPlot(co2.met, percentile = 0.95) # 상위 5% 값은 제거
summaryPlot(co2.met, na.len = 10) # 적어도 10개이상 연속적인 결측치를 보여줌
summaryPlot(co2.met, col.data = "green") # 자료 색깔을 녹색으로
summaryPlot(co2.met, col.mis = "yellow") # 결측치를 노란색으로
summaryPlot(co2.met, col.dens = "black") # density plot선을 검은색으로
summaryPlot(co2.met[, c(5,2,4)]) # 컬럼 2번째와 5-7번째만 보여주기
summaryPlot(subset(co2.met, select = c(date, value, wind_speed))) # 앞선 명령어의 대안
colnames(co2.met)[c(2, 3,4)] = c("co2","wd", "ws") # 풍향, 풍속의 컬럼 이름을 wd, ws로 교체. (교체 안할 시 일일이 지정해야하는 번거로움..)
windRose(co2.met) # 기본 바랑장미
windRose(co2.met, type = "month", layout = c(4, 3)) # 월별 바랑장미
windRose(co2.met[is.na(co2.met$co2) == F,], type = "co2", layout = c(4, 1)) # PM2.5 구간에 따른 바람장비
### pollution rose
pollutionRose(co2.met, pollutant = "co2") # PM2.5 농도 구간별 풍향의 빈도 수
pollutionRose(co2.met, pollutant = "co2", normalise = TRUE) # normalized된 PM2.5 농도 구간별 풍향의 빈도 수
polarPlot(co2.met, pollutant = "co2")
polarPlot(co2.met, pollutant = "co2", statistic = "cpf", percentile = 75) # Conditional Probability Function
polarPlot(co2.met, pollutant = "co2", statistic = "cpf", percentile = c(0,10)) # Conditional Probability Function
polarPlot(co2.met, pollutant = "co2", statistic = "cpf", percentile = c(50,60)) # Conditional Probability Function
polarPlot(co2.met, pollutant = "co2", type = "daylight") # ”year”, ”hour”, ”month”, ”season”, ”weekday”, ”weekend”, ”monthyear”, ”daylight”
st = as.POSIXct("2018-12-01") # 분석 시작 날짜
et = as.POSIXct("2019-03-31") # 분석 종료 날짜
calendarPlot(co2.met[co2.met$date >= st & co2.met$date <= et,], pollutant = "co2") # 용산 PM2.5 농도 기준, 표시
calendarPlot(co2.met[co2.met$date >= st + years(1) & co2.met$date <= et + years(1),], pollutant = "co2") # 분석 기간 기준을 1년 후로 미룸. 용산 PM2.5 농도 기준, 표시
calendarPlot(co2.met[co2.met$date >= st & co2.met$date <= et,], pollutant = "co2", annotate = "ws") # 관악 PM2.5 기준 농도가 아닌, 풍향/풍속 표시
smoothTrend(co2.met, pollutant = "co2", deseason = TRUE, simulate = F, ylab = "concentration (ppm)",
main = "monthly mean deseasonalised CO2 (bootstrap uncertainties)") # smooth trend를 계산. GAM 모델을 사용하여 smooth를 수행
## Warning in StructTS(myts): possible convergence problem: 'optim' gave code = 52
## and message 'ERROR: ABNORMAL_TERMINATION_IN_LNSRCH'
smoothTrend(co2.met, pollutant = "co2", deseason = TRUE, simulate = F, ylab = "concentration (ppm)",
main = "monthly mean deseasonalised CO2 (bootstrap uncertainties)", type = "wd") # 풍향을 기준으로 분류
## Warning: 5744 missing wind direction line(s) removed
## Warning: possible convergence problem: 'optim' gave code = 52 and message
## 'ERROR: ABNORMAL_TERMINATION_IN_LNSRCH'
## Warning: possible convergence problem: 'optim' gave code = 52 and message
## 'ERROR: ABNORMAL_TERMINATION_IN_LNSRCH'
TheilSen(co2.met, pollutant = "co2", deseason = TRUE, ylab = "CO2", main = "Theil-Sen Trend") # Theil-sen 기울기 계산산
## Warning in StructTS(myts): possible convergence problem: 'optim' gave code = 52
## and message 'ERROR: ABNORMAL_TERMINATION_IN_LNSRCH'
## [1] "Taking bootstrap samples. Please wait."
TheilSen(co2.met, pollutant = "co2", deseason = TRUE, ylab = "CO2", main = "Theil-Sen Trend", type = "season") # 계절절을 기준으로 분류
## Warning in StructTS(myts): possible convergence problem: 'optim' gave code = 52
## and message 'ERROR: ABNORMAL_TERMINATION_IN_LNSRCH'
## [1] "Taking bootstrap samples. Please wait."
## [1] "Taking bootstrap samples. Please wait."
## Warning in StructTS(myts): possible convergence problem: 'optim' gave code = 52
## and message 'ERROR: ABNORMAL_TERMINATION_IN_LNSRCH'
## [1] "Taking bootstrap samples. Please wait."
## [1] "Taking bootstrap samples. Please wait."
### timeVariation 분석
# 기본 그림
timeVariation(co2.met, pollutant = "co2")
# 여러 항목들의 시간변화 비교 (절대값이 다르기에 nomarlized 적용)
timeVariation(co2.met, pollutant = c("co2", "wd", "ws"), normalise = TRUE)
# factor (예: 기준)을 적용하여 전,후 차이를 비교. 아래는 코로나 전, 후의 NO2의 변화
co2.met[co2.met$date < as.POSIXct("2010-01-01"), "millenium"] = "Before 2010" # 코로나 전 지정
co2.met[co2.met$date >= as.POSIXct("2010-01-01"), "millenium"] = "After 2010" # 코로나 후 지정
timeVariation(co2.met, pollutant = "co2", group = "millenium", difference = TRUE)
timeVariation(co2.met, pollutant = "co2", group = "millenium", difference = TRUE, ylim = c(350,450))
co2.met = rollingMean(co2.met, pollutant = "co2", hours = 8, new.name = "co2.8", data.thresh = 75) # 8시간 이동 평균
trendLevel(co2.met, pollutant = "co2", cols = "jet", y = "hour")
setwd("D:/HUFS/Workspace/Rclass/CC_2023/")
install.packages("readxl")
library(readxl)
argument | 설명 |
---|---|
path | R에서 읽어올 외부 데이터가 있는 파일의 위치(경로)와 파일명(확장자 포함)을 문자형으로 지정한다. |
sheet | 엑셀 파일의 있는 시트(sheet) 중에서 어떤 시트인지를 지정하는 것으로 시트명을 알고 있으면 문자형으로 지정하며, 시트의 위치(index)를 알면 수치형으로 지정하면 된다. |
col_names | 논리형으로 엑셀에 있는 변수명을 사용할 지를 의미한다. TRUE이면 엑셀에 있는 변수명을 사용한다 |
DAT = read_excel(path = “파일명”, sheet = “Sheet1”, col_names = TRUE)
DAT = read_excel(path = “파일명”, sheet = “Sheet1”, col_names = TRUE)
nier_aqm = read_excel(path = "2022_12.xlsx", sheet = "Sheet1", col_names = TRUE)
nier_site = read_excel(path = "nier_site.xlsx", sheet = "Sheet1", col_names = TRUE, na = "NA")
str(nier_aqm)
## tibble [480,622 × 12] (S3: tbl_df/tbl/data.frame)
## $ sido : chr [1:480622] "서울 중구" "서울 중구" "서울 중구" "서울 중구" ...
## $ type : chr [1:480622] "도시대기" "도시대기" "도시대기" "도시대기" ...
## $ code : num [1:480622] 111121 111121 111121 111121 111121 ...
## $ name : chr [1:480622] "중구" "중구" "중구" "중구" ...
## $ date : num [1:480622] 2.02e+09 2.02e+09 2.02e+09 2.02e+09 2.02e+09 ...
## $ SO2 : num [1:480622] 0.003 0.003 0.003 0.003 0.003 0.003 0.003 0.003 0.003 0.003 ...
## $ CO : num [1:480622] 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.4 0.5 0.4 ...
## $ O3 : num [1:480622] 0.029 0.03 0.028 0.03 0.029 0.028 0.02 0.009 0.01 0.013 ...
## $ NO2 : num [1:480622] 0.006 0.006 0.006 0.005 0.006 0.008 0.015 0.026 0.029 0.026 ...
## $ PM10 : num [1:480622] 15 12 14 15 15 16 14 21 25 24 ...
## $ PM25 : num [1:480622] 6 3 4 6 7 6 7 7 8 9 ...
## $ address: chr [1:480622] "서울 중구 덕수궁길 15" "서울 중구 덕수궁길 15" "서울 중구 덕수궁길 15" "서울 중구 덕수궁길 15" ...
str(nier_site)
## tibble [882 × 8] (S3: tbl_df/tbl/data.frame)
## $ sido : chr [1:882] "서울" "서울" "서울" "서울" ...
## $ city : chr [1:882] "서울" "서울" "서울" "서울" ...
## $ code : num [1:882] 111121 111122 111122 111123 111124 ...
## $ name : chr [1:882] "중구" "한강대로" "한강대로" "종로구" ...
## $ address: chr [1:882] "중구 덕수궁길 15 (시청서소문별관 3동)" "용산구 한강대로 405 서울역앞" "용산구 한강대로 405 서울역앞" "종로구 종로35가길 19 (종로5.6가동 주민센터)" ...
## $ lon : num [1:882] 127 127 127 127 127 ...
## $ lat : num [1:882] 37.6 37.5 37.5 37.6 37.6 ...
## $ type : chr [1:882] "도시대기측정망" "도로변대기측정망" "유해대기물질측정망" "도시대기측정망" ...
unique(nier_site$type)
## [1] "도시대기측정망" "도로변대기측정망"
## [3] "유해대기물질측정망" "PM2.5성분측정망"
## [5] "대기중금속측정망" "산성강하물측정망"
## [7] "종합대기측정소" "광화학대기오염물질측정망"
## [9] "교외대기측정망" "항만측정망"
## [11] "국가배경농도측정망" "대기환경연구소"
Sys.getlocale()
## [1] "LC_COLLATE=English_United States.utf8;LC_CTYPE=English_United States.utf8;LC_MONETARY=English_United States.utf8;LC_NUMERIC=C;LC_TIME=English_United States.utf8"
Sys.setlocale("LC_ALL","C") # 강제 언어 삭제
## [1] "C"
unique(nier_site$type)
## [1] "<U+B3C4><U+C2DC><U+B300><U+AE30><U+CE21><U+C815><U+B9DD>" "<U+B3C4><U+B85C><U+BCC0><U+B300><U+AE30><U+CE21><U+C815><U+B9DD>"
## [3] "<U+C720><U+D574><U+B300><U+AE30><U+BB3C><U+C9C8><U+CE21><U+C815><U+B9DD>" "PM2.5<U+C131><U+BD84><U+CE21><U+C815><U+B9DD>"
## [5] "<U+B300><U+AE30><U+C911><U+AE08><U+C18D><U+CE21><U+C815><U+B9DD>" "<U+C0B0><U+C131><U+AC15><U+D558><U+BB3C><U+CE21><U+C815><U+B9DD>"
## [7] "<U+C885><U+D569><U+B300><U+AE30><U+CE21><U+C815><U+C18C>" "<U+AD11><U+D654><U+D559><U+B300><U+AE30><U+C624><U+C5FC><U+BB3C><U+C9C8><U+CE21><U+C815><U+B9DD>"
## [9] "<U+AD50><U+C678><U+B300><U+AE30><U+CE21><U+C815><U+B9DD>" "<U+D56D><U+B9CC><U+CE21><U+C815><U+B9DD>"
## [11] "<U+AD6D><U+AC00><U+BC30><U+ACBD><U+B18D><U+B3C4><U+CE21><U+C815><U+B9DD>" "<U+B300><U+AE30><U+D658><U+ACBD><U+C5F0><U+AD6C><U+C18C>"
nier_site = nier_site[nier_site$type %in% c("도시대기측정망", "도로변대기측정망"),]
nier_aqm = nier_aqm[is.na(nier_aqm$PM10) == F & is.na(nier_aqm$PM25) == F,]
nier_aqm_latlon = merge(nier_aqm, nier_site[,c("code", "lon", "lat")], by = "code")
install.packages("maps")
library(maps)
{plot(nier_aqm_latlon$lat ~ nier_aqm_latlon$lon) # 위경도에 따른 심볼 그림
map("world", add = T) # 지도 추가
}
{plot(nier_aqm_latlon$lat ~ nier_aqm_latlon$lon, xlab = "", ylab = "") # 위경도에 따른 심볼 그림
mtext(text = expression("Latitude ("*degree*"E)"), line = 2, side = 2) # y축 이름
mtext(text = expression("Longtitude ("*degree*"E)"), line = 2, side = 1) # x축 이름
map("world", add = T) # 지도 추가
}