직장에서 가끔 사용하는 R 기능

[excel, R] 100만행이 넘는 자료도 피벗테이블을 그릴 수 있다.

하트 뿅뿅 2020. 10. 18. 22:58
반응형

안녕하세요. 슬기로운 직장생활 블로그 운영자 입니다.

 

100만행이 넘는 자료를 R로 읽어들이는 방법을 소개해드린적 있습니다.

 

data.table페키지의 fread를 통한 방법이었죠, 여러개의 파일을 읽어야 하는 경우에는 lapply를 사용한 다음 rbindlist를 통해 처리할 수 있었습니다.

 

그럼 이번에는 reshape2, dplyr 페키지를 이용하여 r로 피벗테이블을 그리고 이것을 출력하는 방법을 배워보겠습니다.

 


 

  1. reshape2 , dplyr, data.table 패키지를 설치한다.
  2. 패키지를 불러온다.
  3. csv로 저장한 데이터를 읽어온다. (여러개로 나눠져 있으면 rbindlist로 합친다.)
  4. dcast, melt 함수를 사용해서 피벗테이블을 그린다.
  5. write.table 함수를 사용해서 피벗테이블을 csv로 출력한다.

1. install.packages(c("reshpae2", "dplyr", "data.table")) 로 실행

2. library(c("reshpae2", "dplyr", "data.table")) 로 실행/에러뜨면 하나씩 불러오면서 에러창 해소.

3. fread, lapply, rbindlist를 쓴다. 이전 블로그 참고

4. 이 부분이 이번 글의 핵심이 되겠습니다.

5. 피벗테이블 결과를 변수로 저장한 다음에, 그 변수를 write.talbe함수를 써서 파일로 내보낸다.

 

그럼 이제 4번 부분을 다뤄볼게요.

 


 

 

melt 함수를 쓰면 여러개의 값이 포함된 다중 열을 만들 수 있어요.

 

예를들어 거래건수, 거래금액을 같이 표기하는 표를 만들고 싶다면 melt를 사용해야 합니다.

dplyr 의 summarize함수를 통해도 피벗을 할 수 있지만..한가지 값만 지원하더군요.

 

그래서 다중피벗을 위해 melt 함수와 dcast함수를 쓰게 됩니다.

 

순번 거래금액 거래건수 거래유형 계열사 거래기업
1 100 2 외상 1군 계열사 A사
2 ... ... ... ... ...

data를 abc로 저장했다고 합시다.

 

데이터가 위와 같고 몇백만개가 있다고 합시다. 대기업 계열사의 거래금액을 거래기업별로 정리하고 싶다고 할 때, 어떤식으로 피벗이 될까요?

 

구분 A사 B사
1군 계열사    
2군 계열사    
3군 계열사    

 

이런식으로 요약 된다고 했을 때, 관련 코드는 다음과 같습니다.

 

pivot2<-melt(abc, id.vars=c("계열사","거래기업"), mesure.var="거래금액"))

result<-dcast(pivot2, 계열사~거래기업, value.var="value", margins=TRUE, fun.aggregate=sum, na.rm=T)

 

만약에 거래금액과 거래건수까지 피벗을하고 싶다면 어떻게 될까요?

 

구분 A사 B사
거래건수 거래금액 거래건수 거래금액
1군 계열사        
2군 계열사        
3군 계열사        

이런식으로 요약 된다고 했을 때, 관련 코드는 다음과 같습니다.

 

pivot3<-melt(abc, id.vars=c("계열사","거래기업"), mesure.var=c("거래금액","거래건수"))

result2<-dcast(pivot3, 계열사~거래기업+variable, value.var="value", margins=TRUE, fun.aggregate=sum, na.rm=T)

 

위의 코드와 비교하면 dacst에 +variable이 붙었죠, 그리고 melt에서 mesure.var에 거래건수가 추가 되었습니다.

 

마치 엑셀에서 피벗할 때 값에 거래금액과, 거래건수를 넣는것과 마찬가지인 거죠.

 

오늘의 포스팅은 여기서 마치겠습니다. 행복한 직장생활 되시기 바랍니다.

 

100만개가 넘어도 600백만개가 넘어도 통하는 R로 엑셀의 피벗기능 대신하기였습니다.

 

 

 

반응형