시스템에서 일반적으로 데이터를 받으면 항상 겪는 문제가 있다. 일자, 월을 받는 것인데, 일자나 월은 1자리수도 있고 2자리수도 있다. 이것을 데이터로 묶어서, 년월일을 8자리로 바꾸거나 아니면 2021-05-10 처음 년월일 사이에 "-" 하이픈을 넣은 다음 Date 형태로 데이터 유형을 바꾸는 경우가 있다.
년월일 8자리로 묶었을 때의 장점은 데이터 소팅이 가능 하다는 것이다. 기본적으로 데이터 소팅은 자리수가 같아야 할 수 있다. 자리수가 다를 경우 아래와 같이 소팅이 잘못 될 수도 있다.
2015년 1월 11일과 2015년 2월 2일의 소팅 값이 바뀌었고, 눈으로 식별 하기가 어렵다.
> a <- c(2015111, 201522, 20151001)
> sort(a)
201522 2015111 20151001
지금 까지 친 소스코드를 파이프연산자 %>%를 활용 해서, 간단하게 정리 하였고, 계약일자의 자리수가 문제가 있다.
# 라이브러리 불러오기
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(",", "", 거래금액_만원)))
glimpse(apt %>% select(계약년월, 계약일))
## Rows: 296,656 ## Columns: 2 ## $ 계약년월 <chr> "202103", "202103", "202103", "202103", "202103", "202103", "2021… ## $
계약일 <chr> "31", "11", "15", "26", "31", "2", "9", "27", "9", "10", "2", "1…
# 문자열을 카운트 한 다음 앞에 0일 붙임
apt <- apt %>%
mutate(계약일 = ifelse(nchar(계약일) ==1,
paste( "0", 계약일, sep = ""),
계약일 ))
apt$계약일[1:10]
## [1] "31" "11" "15" "26" "31" "02" "09" "27" "09" "10"
자리수가 바뀌었다. 자리수가 바뀌었다고 모두 끝나는 것이 아니다. 계약일자로 8자리 charactor로 만들어야 한다.
# 일자 자릿수를 8자리를 만든다.
apt <- apt %>%
mutate(계약일자 = paste0(계약년월, 계약일))
apt$계약일자[1:10]
## [1] "20210331" "20210311" "20210315" "20210326" "20210331" "20210302"
## [7] "20210309" "20210327" "20210309" "20210310"
nchar(변수)
데이터 붙이기
paste(a, b , sep ="") , sep는 간격임 또는
paste0(a, b), a와 b 문자열을 붙임
여기에서 데이터 관리의 노하우가 나오는데, 예를 들면, 아파트 거래시 같은 일자에 여러번 계약되는 경우가 있다. 이를 경우에는 데이터를 그룹화 하여 평당 가격을 평균으로 구한다.
# 강남구 논현동 계약일자별 평당 가격
apt %>%
filter(시군구 == "서울특별시 강남구 논현동") %>%
mutate(평당가격 = 거래금액_만원 / (전용면적_m3/3.3) ) %>%
group_by(시군구,계약일자) %>%
summarise(평당가격_일별= mean(평당가격))
## # A tibble: 485 x 3
## # Groups: 시군구 [1]
## 시군구 계약일자 평당가격_일별
## <chr> <chr> <dbl>
## 1 서울특별시 강남구 논현동 20170701 3292.
## 2 서울특별시 강남구 논현동 20170703 3213.
## 3 서울특별시 강남구 논현동 20170704 1994.
## 4 서울특별시 강남구 논현동 20170707 2853.
## 5 서울특별시 강남구 논현동 20170710 3720.
## 6 서울특별시 강남구 논현동 20170711 2689.
## 7 서울특별시 강남구 논현동 20170712 4430.
## 8 서울특별시 강남구 논현동 20170713 5819.
## 9 서울특별시 강남구 논현동 20170714 3510.
## 10 서울특별시 강남구 논현동 20170715 3479.
## # … with 475 more rows
댓글 없음:
댓글 쓰기