그룹별 텍스트 병합

그룹별 텍스트 한 줄로 합치기는 언제 필요한가?

데이터를 다룰 때 종종 변수별로 텍스트를 하나로 합쳐야 할 때가 있습니다. 예를 들어, 시도별로 시군구 목록을 정리하거나, 특정 그룹 내 텍스트를 쉼표로 연결해 표현하고 싶을 때가 있죠. 이번 글에서는 R을 사용해 그룹별 텍스트를 한 줄로 합치는 방법을 소개합니다.

데이터 준비하기

이번 예제에서는 통계청의 시군구별 고령인구 데이터를 활용해, 각 시도별로 시군구 목록을 정리해보겠습니다. 먼저 데이터를 엑셀 파일로 불러옵니다.

library(readxl)

data <- read_xlsx("데이터/인구/고령인구비율_시군구_2023.xlsx", skip=1)

# 데이터 확인
head(data)
## # A tibble: 6 × 4
##   `행정구역별(1)` `행정구역별(2)` 65세이상인구<br>(A) (…¹ `전체인구<br>(B) (명)`
##   <chr>           <chr>                             <dbl>                  <dbl>
## 1 전국            소계                            9730411               51325329
## 2 서울특별시      소계                            1733580                9386034
## 3 서울특별시      종로구                            28500                 139417
## 4 서울특별시      중구                              25525                 121312
## 5 서울특별시      용산구                            39239                 213151
## 6 서울특별시      성동구                            49260                 277361
## # ℹ abbreviated name: ¹​`65세이상인구<br>(A) (명)`

데이터를 살펴보면, ‘행정구역별(1)’ 열에는 전국과 17개 시도가, ‘행정구역별(2)’ 열에는 각 시도의 소계와 시군구 목록이 포함되어 있습니다. 시군구 목록을 정리하려면 “전국”과 “소계” 데이터를 제외해야 합니다. 특히, 세종특별자치시는 시군구가 없고 소계 데이터만 포함되어 있으므로, 이 부분을 주의해서 필터링합니다. 불필요한 데이터를 제거하고, 필요한 열만 선택합니다. ‘소계’ 데이터를 처리하면서 세종특별자치시는 그대로 유지하도록 조건을 추가합니다.

  • rename: 열 이름을 시도, 시군구로 변경해 이해하기 쉽게 만듭니다
  • select: 필요한 열(시도, 시군구)만 선택합니다
  • filter: ‘전국’과 ’소계’ 데이터를 제외하며, 세종특별자치시는 예외로 유지합니다
  • mutate: 세종특별자치시의 ‘소계’ 값을 빈 문자열로 바꿉니다
tmp <- data %>% 
  rename(시도=`행정구역별(1)`,
         시군구=`행정구역별(2)`) %>% 
  select(시도, 시군구) %>% 
  filter(시도 != "전국",
         (시도 == "세종특별자치시")|(시군구 != "소계")) %>% 
  mutate(시군구 = case_when(시군구 == "소계" ~ "",
                         T ~ 시군구))

그룹별 텍스트 합치기

필터링된 데이터를 바탕으로 각 시도별로 시군구를 한 줄로 합칩니다. 이를 위해 group_bysummarise를 사용하며, paste0collapse를 활용해 시군구 이름을 쉼표로 연결합니다.

sum <- tmp %>% 
  group_by(시도) %>% 
  summarise(시군구 = paste0(시군구, collapse=", "))

# 결과 확인
head(sum)
## # A tibble: 6 × 2
##   시도           시군구                                                         
##   <chr>          <chr>                                                          
## 1 강원특별자치도 춘천시, 원주시, 강릉시, 동해시, 태백시, 속초시, 삼척시, 홍천군…
## 2 경기도         수원시, 성남시, 의정부시, 안양시, 부천시, 광명시, 평택시, 동두…
## 3 경상남도       진주시, 통영시, 사천시, 김해시, 밀양시, 거제시, 양산시, 창원시…
## 4 경상북도       포항시, 경주시, 김천시, 안동시, 구미시, 영주시, 영천시, 상주시…
## 5 광주광역시     동구, 서구, 남구, 북구, 광산구                                 
## 6 대구광역시     중구, 동구, 서구, 남구, 북구, 수성구, 달서구, 달성군, 군위군

그룹별 개수 추가하기

시도별 시군구 수를 함께 계산하려면 summarise에서 n을 사용합니다. n은 그룹별 행의 개수를 세어줍니다. 이를 통해 시도별 시군구 목록과 시군구 개수를 동시에 확인할 수 있습니다.

이제 각 시도의 시군구 목록과 함께 해당 시도의 시군구 수까지 포함된 데이터프레임이 생성됩니다. “서울특별시”는 “종로구, 중구, 용산구…”라는 시군구 목록과 함께 시군구 개수가 함께 출력됩니다.

sum <- tmp %>% 
  group_by(시도) %>% 
  summarise(시군구 = paste0(시군구, collapse=", "),
             = n())

# 결과 확인
head(sum)
## # A tibble: 6 × 3
##   시도           시군구                                                       수
##   <chr>          <chr>                                                     <int>
## 1 강원특별자치도 춘천시, 원주시, 강릉시, 동해시, 태백시, 속초시, 삼척시, …    18
## 2 경기도         수원시, 성남시, 의정부시, 안양시, 부천시, 광명시, 평택시…    31
## 3 경상남도       진주시, 통영시, 사천시, 김해시, 밀양시, 거제시, 양산시, …    18
## 4 경상북도       포항시, 경주시, 김천시, 안동시, 구미시, 영주시, 영천시, …    22
## 5 광주광역시     동구, 서구, 남구, 북구, 광산구                                5
## 6 대구광역시     중구, 동구, 서구, 남구, 북구, 수성구, 달서구, 달성군, 군…     9

이번 글에서는 R의 dplyrpaste0를 활용해 그룹별 텍스트를 한 줄로 합치는 방법을 알아봤습니다. 이 방법은 텍스트 데이터를 그룹화해 간단히 요약하거나, 데이터의 주요 내용을 정리할 때 유용합니다. 시도별로 데이터를 정리하는 것처럼, 다양한 상황에 응용해보세요!