[R] 두 개의 텍스트 파일 비교 분석 (feat. tidyverse)

해당 포스트는 R에서 텍스트 파일들을 불러와 비교 분석(교집합, 차집합)을 수행하는 예제입니다.

1. 배경

네이버 지식인 활동을 하면서 아래와 같은 1:1 질문을 받게되었고 답변을 좀 더 자세히 남기기 위해 포스팅을 작성하게 되었다.

2. 질문

1.txt 와 2.txt 파일에 샘플 이름이 들어있다.

이 두 파일에서 공통적인 샘플이름과 각 파일에서만 나오는 샘플 이름을 정리하는 프로그램을 작성해보시오.

input이 txt파일들로 주어져있고, 샘플이 셀수 있을 정도가 아닌 상황에서의 코딩 방법이 궁금합니다.

예상 시나리오

# Files
1.txt = {Sample1, Sample2, Sample3}
2.txt = {Sample1, Sample3, Sample4}

# Common
Sample1
Sample3

# File1 unique
Sample2

# File2 unique
Sample4

3. 풀이

해당 문제를 풀기위해 아래 2가지 단계로 코드를 작성하였습니다.

  1. 특정 폴더에 들어있는 모든 파일 리스트 읽어오기
  2. 두 파일을 비교하여 공통 샘플 이름, 각 파일에만 있는 샘플 이름을 출력하는 함수 작성

1. 폴더 내 모든 파일 리스트 읽어오기

아래는 특정 폴더의 모든 파일을 불러와 my_files 변수에 담는 코드입니다. 모든 파일명이 변수에 담기게 되며 해당 벡터(vector) 번호를 이용하여 파일명 추출이 가능합니다. (e.g. my_files[1], my_files[3], ...)

library(tidyverse)

# 파일 불러오기
my_files <- list.files("../data/example/")
my_files
## [1] "1.txt" "2.txt" "3.txt" "4.txt" "5.txt"

2. 두 파일을 비교하는 사용자 함수 생성 - compare_files()

질문자께서 요청하신 2개 파일의 샘플 비교를 위해 사용자 함수를 만들었습니다.
사용자 함수에서는 2개의 파일명을 입력값으로 받으며, 두 파일의 교집합, 차집합을 계산하여 출력합니다.

  • 사용법 : compare_files(파일명1, 파일명2)
  • 출력1(intersect) : 두 파일의 공통 샘플
  • 출력2(setdiff(1-2)) : 1번 파일에만 있는 샘플
  • 출력3(setdiff(2-1)) : 2번 파일에만 있는 샘플
# 하나의 파일에 담기
my_data <- NULL

compare_files <- function(file1, file2){

  my_file1 <- read_lines(paste0("../data/example/", file1))
  my_file2 <- read_lines(paste0("../data/example/", file2))

  cat("- file1 : ", my_file1, "\n")
  cat("- file2 : ", my_file2, "\n")
  cat("- intersect : ", intersect(my_file1, my_file2), "\n") # 교집합
  cat("- setdiff(1-2) : ", setdiff(my_file1, my_file2), "\n") # 차집합 : 파일1에만 있는 샘플
  cat("- setdiff(2-1) : ", setdiff(my_file2, my_file1), "\n") # 차집합 : 파일2에만 있는 샘플
}

3. 결과 확인하기

아래는 출력 결과 확인을 위한 예시 실행 결과 입니다.

  • "1.txt" vs "2.txt"
compare_files("1.txt", "2.txt")
## - file1 :  Sample1 Sample2 Sample3 Sample5 Sample6 Sample9 Sample10 
## - file2 :  Sample2 Sample3 Sample4 Sample7 Sample8 Sample9  
## - intersect :  Sample2 Sample3 Sample9 
## - setdiff(1-2) :  Sample1 Sample5 Sample6 Sample10 
## - setdiff(2-1) :  Sample4 Sample7 Sample8  
  • "3.txt" vs "5.txt"
compare_files("3.txt", "5.txt")
## - file1 :  Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 
## - file2 :  Sample1 Sample3 Sample5 Sample7 Sample9 
## - intersect :  Sample1 Sample3 Sample5 
## - setdiff(1-2) :  Sample2 Sample4 Sample6 
## - setdiff(2-1) :  Sample7 Sample9  

4. 마무리

이번 포스트에서는 R에서 두 개의 파일에 있는 값을 비교하는 방법에 대해 설명하였습니다. 위 풀이에서는 파일로 구분하여 설명하였지만 기본적으로 두 벡터 또는 리스트 내에 들어있는 값들의 비교에도 사용할 수 있으니 이해에 참고하면 좋을 것 같다.


banner-request-analysis