해당 포스트는 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. 폴더 내 모든 파일 리스트 읽어오기
아래는 특정 폴더의 모든 파일을 불러와 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에서 두 개의 파일에 있는 값을 비교하는 방법에 대해 설명하였습니다. 위 풀이에서는 파일로 구분하여 설명하였지만 기본적으로 두 벡터 또는 리스트 내에 들어있는 값들의 비교에도 사용할 수 있으니 이해에 참고하면 좋을 것 같다.