정보

    • 업무명     : 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 분석을 위한 패키지로서 사용된다.

    • 이후 데이터를 읽고 해당 데이터 내에 존재하는 모든 컬럼의 이름을 불러온다.

    • 입력자료의 예시는 아래의 파일에 첨부하였다.

    temp_dataframe.txt
    4.92MB

     

    2. 컬럼의 이름으로부터 날짜정보 추출 -> 인덱싱 -> 인덱싱된 컬럼 선택

     

    • 다음으로는 불러온 컬럼의 정보로부터 날짜 정보를 추출한다.

    • 각 컬럼의 이름으로부터 날짜에 대한 정보를 추출하기 위해 BASE 패키지의 substr 함수를 사용하여 이를 숫자로 변환하는 작업을 먼저 수행하였다.

    • 다음으로 which 문을 이용하여 조건에 맞는 날짜를 인덱싱 하는 작업을 수행한다. 이는 각 날짜 변수 (year_index ~ hour_index) 를 통해 각 조건에 따른 인덱싱이 이루어지며, 최종적으로 이들 4개의 날짜변수간의 교집합을 사용함으로서 최종적으로 위의 조건에 모두 부합하는 날짜를 선택할 수 있게 된다. 예시에서는 2010년 7월 10일 ~ 12일 까지의 자료 중 06시 ~ 15시 까지의 자료를 선택하였으며, 해당 위치의 소스코드를 수정하는 경우 언제든지 임의의 날짜를 선택할 수 있다.

    • 마지막으로 최종적으로 선택한 인덱스 번호를 (all_index)  -> select 문 내부에 넣음으로서 조건에 맞는 컬럼 선택이 완료 되었다.

     

    3. 각 위치별 온도의 평균값 / 최대값 / 최소값 구하기 -> 출력

     

    • 이후 rowMeans, rowMaxs, rowMins 함수를 이용하여 각 행별 (위치별) 평균, 최대, 최소값을 구한다.

    • 그리고 기존에 제거하였던 위치정보를 다시 불러와 데이터 프레임에 병합 후 출력한다.

     

    4. 출력결과

    출력결과 예시
    temp_summary.txt
    0.01MB

     

    • 출력결과는 위의 파일 및 그림과 같다.

     

    5. 전체 소스코드

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기