# 1. 파일 불러오기


test01 <- readLines("airport_raw.txt")

head(test01)


> head(test01)

[1] "모스크바 셰레메티예보 공항의 터미널 구조"

[2] ""

[3] "인천국제공항"

[4] ""

[5] "프랑크푸르트 공항에 있는 루프트한자 항공기"

[6] "공항(空港, 영어: airport)은 상업용 제반 항공기의 발착에 필요한 시설을 갖춘 공개비행장을 말한다. 주로 여객기·화물기 등의 항공기 이착륙에 이용한다. 항공기의 대형화와 항공기 대()수의 증가로 공항시설의 확장이 대부분의 도시에서 요청된다."


국제공항이 있는 도시의 이름과 공항 이름 칼럼이 있는 데이터 프레임을 생성하기 위해 관련 위키피디아 페이지의 정보를 텍스트 파일로 저장해 사용하였습니다.



[그림 1. 위키피디아 '국제공항' 페이지 (https://ko.wikipedia.org/wiki/%EA%B5%AD%EC%A0%9C%EA%B3%B5%ED%95%AD)]




# 2. ':'가 있는 행만 추출하기 (& 값 불러오기, data frame로 추출)


test02 <- grep(":", test01)

head(test02, 10)


> test02 <- grep(":", test01)

> head(test02, 10)

[1]  6 18 19 20 21 22 23 24 25 27


test03 <- as.data.frame(test01[test02], stringsAsFactor = FALSE)

test03 <- test03 %>% rename(city = `test01[test02]`)

head(test03, 5)


> test03 <- as.data.frame(test01[test02], stringsAsFactor = FALSE)

> test03 <- test03 %>% rename(city = `test01[test02]`)

> head(test03, 5)

            city

1 공항(空港, 영어: airport)은 상업용 제반 항공기의 발착에 필요한 시설을 갖춘 공개비행장을 말한다. 주로 여객기·화물기 등의 항공기 이착륙에 이용한다. 항공기의 대형화와 항공기 대(臺)수의 증가로 공항시설의 확장이 대부분의 도시에서 요청된다.

2 서울:김포 국제공항

3 인천:인천 국제공항

4 제주:제주 국제공항

5 부산:김해 국제공항


[그림 1]을 보면 위키피디아 '국제공항' 페이지의 자료가 '국가명:국제 공항 명'으로 되어있음을 알 수 있습니다. 따라서 'grep'을 사용하여 : 를 포함한 행만 추출했습니다.  'grep'은 인덱스를 반환하는 함수이므로 '원 데이터[결과 데이터]'로 값을 불러오는 단계 거쳤고, 'head'로 출력한 값을 보면 원하는 행이 제대로 추출되었음을 알 수 있습니다. 




# 3. 글자수 필터링


test04 <- test03 %>% filter(nchar(city) > 5 & nchar(city) < 30)

head(test04)


> test04 <- test03 %>% filter(nchar(city) > 5 & nchar(city) < 30)

> head(test04, 10)

                       city

1                    서울:김포 국제공항

2                    인천:인천 국제공항

3                    제주:제주 국제공항

4                    부산:김해 국제공항

5                    대구:대구 국제공항

6                    강원:양양 국제공항

7                    전남:무안 국제공항

8                    충북:청주 국제공항

9  도쿄:하네다 국제공항,나리타 국제공항

10               오사카:간사이 국제공항


test03의 1행과 같이 공항 명이 아닌 다른 정보인데 ':' 를 포함하는 값을 제거해주기 위해서 글자수 길이를 이용하여 데이터를 필터링했습니다.




# 4. (도시):(공항) > ':'를 기준으로 열 구분짓기


test05 <- as.data.frame(str_split_fixed(test04$city, ":", 2), stringsAsFactors = FALSE)

head(test05)


> test05 <- as.data.frame(str_split_fixed(test04$city, ":", 2), stringsAsFactors = FALSE)

> head(test05)

   V1          V2

1 서울         김포 국제공항

2 인천         인천 국제공항

3 제주         제주 국제공항

4 부산         김해 국제공항

5 대구         대구 국제공항

6 강원         양양 국제공항


도시와 공항을 각각의 칼럼으로 만들기 위해 'str_split_fixed'를 이용하여 ':' 를 기준으로 단어를 나누었습니다. 'str_split_fixed(string, pattern, n)'는 'stringr' 패키지에 있는 함수로 처리 대상인 stringpattern 기준에 따라 n개로 나누어 줍니다. 




# 5. 공항 2개인 경우 하나만 남기기


test06 <- as.data.frame(str_split_fixed(test05$V2, ",", 2), stringsAsFactors = FALSE)

head(test06, 10)


> test06 <- as.data.frame(str_split_fixed(test05$V2, ",", 2))

> head(test06)

               V1 V2

1    김포 국제공항                

2    인천 국제공항                

3    제주 국제공항                

4    김해 국제공항                

5    대구 국제공항                

6    양양 국제공항                

7    무안 국제공항                

8    청주 국제공항                

9  하네다 국제공항 나리타 국제공항

10 간사이 국제공항       


국제 공항이 2개 이상 있는 경우 ','로 연결되어 있습니다. (예: 하네다 국제공항, 나리타 국제공항) 따라서 ','를 pattern으로 칼럼을 한 번 더 나눠줍니다. 다음으로 이번 프로젝트는 약식으로 진행하는 것이라 도시별로 대표 국제공항 하나만 사용할 예정입니다. 따라서 아래 보이는 것과 같이 'select'를 이용해 첫 번째 칼럼만 남기겠습니다.


test061 <- test06 %>% select(V1)

head(test061, 10)


> test061 <- test06 %>% select(V1)

> head(test061, 10)

            V1

1 김포 국제공항

2 인천 국제공항

3 제주 국제공항

4 김해 국제공항

5 대구 국제공항

6 양양 국제공항

7 무안 국제공항

8 청주 국제공항

9 하네다 국제공항

10 간사이 국제공항




# 6. 필요 없는 문자열 제거


test062 <- as.data.frame(str_split_fixed(test061$V1, "\\(", 2), stringsAsFactors = FALSE)

head(test062)


> test062 <- as.data.frame(str_split_fixed(test061$V1, "\\(", 2), stringsAsFactors = FALSE)

> head(test062)

            V1 V2

1 김포 국제공항   

2 인천 국제공항   

3 제주 국제공항   

4 김해 국제공항   

5 대구 국제공항   

6 양양 국제공항  


국제공항이라는 단어 뒤에 괄호로 부연 설명이 되어있는 행이 있어 국제공항 이후 부분을 제거해주었습니다. 4. ~ 5.에서 진행한 것과 같은 과정이므로 설명은 생략하겠습니다. 참고로 특수문자 '('의 경우 기능을 가진 제어문자이므로, 문자 그대로를 인식시켜 주기 위해 역슬래쉬 두 개(\\)를 앞에 붙여주었습니다.




# 7. 도시-공항 데이터프레임 생성


test07 <- test05 %>% select(V1) %>% mutate(airport=test062$V1)

test08 <- test07 %>% rename(city = V1)

head(test08)

write.csv(test08, file="airport_mini.csv")


> test07 <- test05 %>% select(V1) %>% mutate(airport=test062$V1)

> test08 <- test07 %>% rename(city = V1)

> head(test08)

 city       airport

1 서울     김포 국제공항

2 인천     인천 국제공항

3 제주     제주 국제공항

4 부산     김해 국제공항

5 대구     대구 국제공항

6 강원     양양 국제공항


공항 명을 정제하느라 나뉘어 있던 두 행을 'mutate'를 사용하여 결합해주었습니다. 결과 도시명과 공항 명이 잘 연결되었음을 알 수 있었습니다. 정제 후에는 다시 과정을 거치지 않고 데이터를 불러오기 위해(너무나도 당연한 말이지만...) 'write.csv'를 이용하여 csv 파일로 내보냈습니다.



+ Recent posts