[strsplit 문자열 나누기, purrr map 함수] 공공데이터 R 프로그램 기초 아파트

   아래 그림과 같이 아파트  시군구가 묶여져 있다.   동별로 묶어서 데이터를 분석 하는데, 문제는 없으나,  시단위로 집계 할 수 없고,  구단위로 집게 할 수 없다.      그럼 아래의 데이터는 어떻게 하는 것이 좋은가?  


 아래 그림과 같이 데이터를  "시" , "구", "동" 컬럼(행)으로 나누면 조회하기도 편리하고, 집계하기도 편리하다. 



  

1. 데이터 전처리 strsplit 데이터 셋 나누기


  library(rio)  
  library(dplyr)
  library(readxl)
  library(httr)

# 파일을 불러오는 path를 url 변수로 정의      
url = "https://drive.google.com/u/0/uc?id=1PT_0-xJvM9KGp5zzx1jjcPAaS25epx4l&export=download"
GET(url, write_disk(tf <- tempfile(fileext = ".xlsx")))
apt <- read_excel(tf, 1L)  # 1L은 sheet 1을 이야기 하는 것이다.
# 아파트 데이터  전처리 계약일자 까지         
  apt <- apt %>% 
          rename(전용면적_m3 = '전용면적(㎡)') %>% 
          rename(거래금액_만원 = '거래금액(만원)') %>% 
          mutate(건축년도 = as.integer(건축년도),
                        층 = as.integer(층)) %>% 
          mutate(전용면적_m3 = as.double(전용면적_m3)) %>%
          mutate(거래금액_만원 = as.integer(gsub(",", "", 거래금액_만원))) %>% 
          mutate(계약일 = ifelse(nchar(계약일) ==1, 
                                 paste( "0", 계약일, sep = ""),
                                 계약일 )) %>% 
          mutate(계약일자 = paste0(계약년월, 계약일))
  

이제는 strsplit 으로 문자열로 나눌 것이다.   strsplit으로 나누는 방법이 여러가지가 있는데, 이번에는 개발 기법으로 함수를 정의 한 다음,  루프문을 돌리겠다.  조금 어렵지만,  데이터를 나누고 나면 편리 하다. 


2. Map 함수 활용

 대량의 데이터 계산은 다양하게 생각해 보았는데, tidyvers에 내장되어 있는 purrr 패키지를 사용 하는 것이  편리 하다고 생각했다.    R은 apply라는 개념이 있기 때문에 계산속도가 비교적 빠른 편인데,  이 소스코드에서는 약 3분 걸린다.  30만개 데이터를 돌리는데,  그 정도는 시간이 많이 걸리는 것이 아니다.   내용을 이해하기는 조금 난해 하다.  그래도 해 보자. 

purrr은 list나 vector를 가지고 각각의 함수를 돌리는 것이다.   간단하게 이야기해서 함수를 루프 돌리는 것과 마찬가지 이다. 하지만 R에서 for문을  돌리기 시작하면, 연산시간이 너무 오래 걸리고, 코드가 복잡해지기 때문에 아래와 같이 돌렸다.   

# map 함수를 돌리기 위해 purrr을 사용한다.  
  library(purrr)
 
# word를 나누는 함수를 구한다.  여기에서 strsplit 함수가 쓰인다.    
  word_fun <- function(i){
   split <-  unlist(strsplit(apt$시군구[i]," "))
   word <-   data.frame(
      시 = split[1] , 구 = split[2], 동 = split[3]
   )
   return(word)
  }   

# apt 데이터 프레임의 열의  갯수를 nrow(apt)로 구한다.   
  x <- 1:nrow(apt)
 
# map 함수로 list를 구한다.   
  system.time( 
   mylist <- x %>% 
                map(word_fun)
  )    
##    user  system elapsed 
##  97.229   0.000  97.235
# list 파일을 데이터 프레임으로 바꾼다.    
   apt_split <- as.data.frame(do.call(rbind,mylist))

# 나누어진 데이터 프레임을 cbind로 컬럼을 묶는다. 
   apt <- cbind(apt_split, apt)
   
# head 를 이용하여, 1번째 부터 4번째 행만 보여준다. 
 head(apt[1:4])
##           시     구     동                   시군구
## 1 서울특별시 강남구 개포동 서울특별시 강남구 개포동
## 2 서울특별시 강남구 개포동 서울특별시 강남구 개포동
## 3 서울특별시 강남구 개포동 서울특별시 강남구 개포동
## 4 서울특별시 강남구 개포동 서울특별시 강남구 개포동
## 5 서울특별시 강남구 개포동 서울특별시 강남구 개포동
## 6 서울특별시 강남구 개포동 서울특별시 강남구 개포동
  여기에서 함수 안에 strsplt을 설명 하면 strsplt(vector, 구분자)로 정리 하면 된다. 
즉,  시 다음에 구가 나오는데,  둘 사이는 공백으로 되어 있기 때문에 구분자를 " "를 사용한 것이다.  그리고 서브 세팅 $ 뒤에 필드(열)명 다음에 [ ] 배열이 나오는데,  배열은 [1]은 첫번째 행을 선택 하는 것이고,  배열 [2]는 두번째 행을 선택 하는 것이다.    즉,  map 함수가 x vector 길이 만큼 반복된다는 것을 알 수 있다.     30만번 가까이 반복하니,  시간이 많이 걸리 수 밖에 없다.   이것을 계산 하는데,  시간이 많이 걸리니,  다음 시간,  일짜 처리 하는 부분은 여기까지 전처리 된 데이터 가지고 하겠다. 


댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...