본문 바로가기
Prop : 부동산/업데이트 일지

[R] data.table 내 텍스트 부분일치 검색 처리

by 프롭테크 2025. 9. 6.
반응형

apt_name이 search_key와 완전일치가 안 되는 경우, 부분일치로도 찾는 second chance 만들기

# 검색 조건에 따라 필터링 (data.table 문법 사용)
filtered_data <- apt_index[apt_name == search_key]

data.table에서는 먼저 완전일치로 찾고, 결과가 없을 때만 부분일치(like/grep)를 수행하면 돼 👍

예시는 이렇게:

# 완전일치 먼저
filtered_data <- apt_index[apt_name == search_key]

# 결과가 없는 경우 부분일치
if (nrow(filtered_data) == 0) {
  filtered_data <- apt_index[grepl(search_key, apt_name)]
}

혹은 한 줄로 fifelse 같이 조건 분기 쓰는 방법도 있어:

filtered_data <- apt_index[apt_name == search_key]

filtered_data <- if (nrow(filtered_data) > 0) filtered_data 
                 else apt_index[grepl(search_key, apt_name)]

👉 여기서 grepl(search_key, apt_name)은 대소문자 구분 있음.

  • 대소문자 무시하고 싶으면 ignore.case = TRUE 옵션 추가하면 돼.

원해? 내가 case-insensitive 버전으로도 다시 짜줄까?

전자와 후자 중에 어떤 게 코딩 컨벤션에 더 맞지?
대소문자는 무시하자.

좋은 질문 👍

보통 R/data.table 컨벤션에서는 전자 방식(완전일치 먼저, 없으면 if로 부분일치) 이 더 많이 쓰여.
이유는:

  • 가독성: 한눈에 “첫 번째 조건 → fallback” 구조가 명확함
  • 디버깅: 언제 부분일치로 넘어갔는지 바로 알 수 있음
  • 유지보수: nrow() 체크를 통해 로직을 쉽게 확장 가능

후자(if (...) else ...로 한 줄 처리)는 깔끔해 보이지만, 실제 협업 코드에서는 조건문이 한 줄에 들어가면 가독성이 떨어지고 리뷰 때 다시 풀어 쓰자는 피드백 나올 확률이 높아.

따라서 첫 번째 방식을 추천할게 🚀

대소문자 무시 버전은 이렇게 쓰면 돼:

# 완전일치 먼저
filtered_data <- apt_index[apt_name == search_key]

# 결과 없으면 부분일치 (대소문자 무시)
if (nrow(filtered_data) == 0) {
  filtered_data <- apt_index[grepl(search_key, apt_name, ignore.case = TRUE)]
}

👉 혹시 이걸 함수화해서 search_key만 바꾸면 재사용 가능하게 만들어줄까?

반응형

댓글