정보
-
업무명 : R 프로그래밍 소개
-
작성자 : 박진만
-
작성일 : 2019-12-21
-
설 명 : 매우 많은 수의 Column을 가지고 있고 해당 Column이 시간 정보를 내포하고 있는 경우 이를 DataFrame의 select 문을 통해 제어하는 방법을 알아보자.
-
수정이력 :
내용
먼저 아래와 같은 데이터가 있다고 가정하자.
lon | lat | 201007010000 | 201007010100 | 201007010200 | 201007010300 | ... |
120 | 30 | value | value | value | value | .. |
121 | 30 | value | value | value | value | ... |
122 | 30 | value | value | value | value | ... |
123 | 30 | value | value | value | value | ... |
124 | 30 | value | value | value | value |
... |
... | ... | ... | ... | ... | ... | ... |
-
위에 나타나는 것 처럼 각각의 행 (row)은 각 위치 정보를 포함하고 있으며 위에서는 위도와 경도 형태로 정보가 나타나고 있다. 그리고 각각의 열 (column) 의 값은 처음 두 열의 위치 값을 제외하고는 시간에 대한 정보를 포함하고 있다. 이때 임의의 기간에 대한 각 위치에 대한 최고값, 최저값, 평균값 등등을 구하고 싶다. 이럴 때는 R 에서 어떻게 처리를 해야 할까?
-
일반적으로 우리가 흔히 접해왔던 익숙한 데이터의 형태는 아래와 같은 테이블의 형태를 가질 것으로 추정된다.
lon | lat | yyyy | mm | dd | hh | value |
120 | 30 | 2010 | 7 | 1 | 0 | value |
120 | 30 | 2010 | 7 | 1 | 1 | value |
120 | 30 | 2010 | 7 | 1 | 2 | value |
120 | 30 | 2010 | 7 | 1 | 3 | value |
120 | 30 | 2010 | 7 | 1 | 4 | value |
120 | 30 | 2010 | 7 | 1 | 5 | value |
120 | 30 | 2010 | 7 | 1 | 6 | value |
120 | 30 | 2010 | 7 | 1 | 7 | value |
... | ... | ... | ... | ... | ... | ... |
-
위와 같은 경우 열의 수는 우리가 샐 수 있을 정도로 고정되어 있으며 이 경우 dplyr package 내부 함수인 filter 와 group_by, summarise 또는 mutate 를 통해 원하는 날짜에 대한 value의 통계량을 손쉽게 뽑아낼 수 있을 것이다.
-
그러나 날짜와 관련된 정보를 다루는 경우 맨 위의 테이블에서 나타나는 것과 같이 테이블을 표출하는 것이 더욱 적합한 경우가 있는 것 또한 사실이다. 가령 예를 들어 모델의 격자값을 시간에 따라 산출하는 경우 일반적으로 아래 테이블 보다는 위의 테이블 형태로 출력하는 경우 또한 존재한다.
-
결과적으로 이는 데이터 분석의 난이도를 조금 더 높이게 된다. 왜냐하면 일반적으로 데이터 분석은 각 컬럼의 헤더(header)의 이름을 기반하여 분석하는 것이 일반적이지만 위의 경우는 컬럼의 이름이 일반적으로 손으로 직접 타이핑 하는것이 불가능 해질 정도로 매우 많아지는 동시에 매우 중요한 날짜정보를 모두 가지고 있기 때문이다.'
-
단순히 데이터의 행과 열을 뒤바꾸어서도 안 되는 것이 위의 데이터는 위도와 경도 2개의 정보를 포함하고 있기에, 이 경우 이중 헤더가 되어버릴 것이다. 따라서 처음부터 위의 테이블 처럼 자료가 표출되는 경우 원하는 날짜에 대한 각 격자별 통계값을 어떤 방식으로 구하는지 알아보도록 하자.
-
이제 실제 데이터의 예시를 보자.
-
바로 위의 테이블은 맨 위의 테이블과 동일한 자료구조를 가지고 있다. 처음 두개의 열은 위치정보를 나타내고 있으며, 그 다음 열 부터는 열 이름에 날짜정보를 포함하고 있다. 그리고 시간별 격자 내부의 값들은 절대온도이다.
-
여기서 특정 날짜의 각 위치별 평균값, 최고값, 최저값을 구하고자 한다. 어떻게 하면 좋을까?
1. 라이브러리 로드 및 파일 읽고 컬럼정보 불러오기
-
우선 첫번째로 해야 할 일은 라이브러리를 로드하는 것이다. 만약 해당 라이브러리가 없다면 먼저 설치를 하도록 하자.
-
여기서 Rfast와 slam은 모두 행별 최대값, 최소값을 구하기 위해 불러온 라이브러리이며
-
dplyr는 DataFrame 분석을 위한 패키지로서 사용된다.
-
이후 데이터를 읽고 해당 데이터 내에 존재하는 모든 컬럼의 이름을 불러온다.
-
입력자료의 예시는 아래의 파일에 첨부하였다.
2. 컬럼의 이름으로부터 날짜정보 추출 -> 인덱싱 -> 인덱싱된 컬럼 선택
-
다음으로는 불러온 컬럼의 정보로부터 날짜 정보를 추출한다.
-
각 컬럼의 이름으로부터 날짜에 대한 정보를 추출하기 위해 BASE 패키지의 substr 함수를 사용하여 이를 숫자로 변환하는 작업을 먼저 수행하였다.
-
다음으로 which 문을 이용하여 조건에 맞는 날짜를 인덱싱 하는 작업을 수행한다. 이는 각 날짜 변수 (year_index ~ hour_index) 를 통해 각 조건에 따른 인덱싱이 이루어지며, 최종적으로 이들 4개의 날짜변수간의 교집합을 사용함으로서 최종적으로 위의 조건에 모두 부합하는 날짜를 선택할 수 있게 된다. 예시에서는 2010년 7월 10일 ~ 12일 까지의 자료 중 06시 ~ 15시 까지의 자료를 선택하였으며, 해당 위치의 소스코드를 수정하는 경우 언제든지 임의의 날짜를 선택할 수 있다.
-
마지막으로 최종적으로 선택한 인덱스 번호를 (all_index) -> select 문 내부에 넣음으로서 조건에 맞는 컬럼 선택이 완료 되었다.
3. 각 위치별 온도의 평균값 / 최대값 / 최소값 구하기 -> 출력
-
이후 rowMeans, rowMaxs, rowMins 함수를 이용하여 각 행별 (위치별) 평균, 최대, 최소값을 구한다.
-
그리고 기존에 제거하였던 위치정보를 다시 불러와 데이터 프레임에 병합 후 출력한다.
4. 출력결과
- 출력결과는 위의 파일 및 그림과 같다.
5. 전체 소스코드
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
'프로그래밍 언어 > R' 카테고리의 다른 글
[R] NetCDF 형식인 NPP/CERES SSF 1deg 기상위성 자료를 이용한 가시화 (0) | 2019.12.30 |
---|---|
[R] NetCDF 형식인 NPP/CERES SSF 기상위성 자료를 이용하여 아스키 (ASCII) 형식으로 처리 (0) | 2019.12.28 |
[R] 동아시아 대기질 이미지 영상을 통해 크롤링 및 애니메이션 구현 (0) | 2019.12.08 |
[R] ggplot2를 이용한 Log 스케일로 산점도 가시화 (0) | 2019.12.06 |
[R] 한반도 연 평균기온 계산 및 Plotting (0) | 2019.11.03 |
최근댓글