부록 E10: R과 Bioconductor
이 장에서 배울 것
이번 장에서는 R과 바이오컨덕터(Bioconductor)를 배웁니다. 파이썬이 범용 프로그래밍과 데이터 처리에 강하다면, R은 통계분석과 생물정보학 패키지 생태계가 매우 강합니다. 특히 RNA-seq, single-cell RNA-seq, 차등발현 분석에서는 R 패키지가 자주 등장합니다.
핵심 용어를 먼저 정리하겠습니다.
- R: 통계분석과 그래프 작성에 많이 쓰이는 프로그래밍 언어입니다.
- 패키지(package): 특정 기능을 묶어 둔 코드 모음입니다.
- 데이터프레임(data.frame): R에서 표 데이터를 나타내는 대표적인 구조입니다.
- 벡터(vector): R에서 같은 종류의 값들이 한 줄로 모인 구조입니다.
- 티디버스(tidyverse): 데이터 정리와 시각화를 편하게 해 주는 R 패키지 묶음입니다.
- ggplot2: R에서 그래프를 그릴 때 많이 쓰는 패키지입니다.
- 바이오컨덕터(Bioconductor): 생물정보학 분석용 R 패키지들을 모아 둔 프로젝트입니다.
- DESeq2: RNA-seq 차등발현 분석에 자주 쓰이는 Bioconductor 패키지입니다.
- Seurat: single-cell RNA-seq 분석에 널리 쓰이는 R 패키지입니다.
가장 쉬운 비유: 생물정보학 전용 공구함
파이썬이 범용 공구함이라면, R과 Bioconductor는 생물정보학자가 많이 쓰는 특수 공구함에 가깝습니다. 통계 검정, 차등발현 분석, 유전체 주석, single-cell 분석처럼 연구 현장에서 자주 쓰는 도구들이 잘 정리되어 있습니다.
R의 기본 계산
R에서도 숫자 계산을 할 수 있습니다.
x <- 10
y <- 20
x + y
R에서는 변수에 값을 넣을 때 <-를 자주 씁니다. 파이썬의 =와 비슷한 역할이라고 보면 됩니다.
벡터 만들기
R에서 벡터는 c()로 만듭니다.
values <- c(2, 4, 6, 8)
mean(values)
mean(values)는 평균을 계산합니다. 여기서는 평균이 5입니다.
데이터프레임 만들기
표 데이터는 데이터프레임으로 다룹니다.
df <- data.frame(
gene = c("BRCA1", "TP53", "EGFR"),
expression = c(12.5, 8.2, 20.1),
group = c("cancer", "normal", "cancer")
)
이 표는 유전자 이름, 발현량, 그룹 정보를 담고 있습니다.
열 선택과 조건 필터링
R에서도 특정 열을 꺼낼 수 있습니다.
df$gene
df$expression
조건에 맞는 행만 고를 수도 있습니다.
df[df$expression >= 10, ]
쉼표 앞은 행 조건, 쉼표 뒤는 열 조건입니다. 여기서는 열 조건을 비워 두었으므로 모든 열을 유지합니다.
ggplot2로 그래프 그리기
ggplot2는 R의 대표적인 그래프 패키지입니다.
library(ggplot2)
ggplot(df, aes(x = gene, y = expression)) +
geom_col()
이 코드는 유전자별 발현량을 막대그래프로 그립니다. 처음에는 문법이 낯설지만, “데이터를 넣고, x축과 y축을 정하고, 어떤 모양으로 그릴지 추가한다”고 생각하면 됩니다.
Bioconductor 설치 감각
Bioconductor 패키지는 보통 BiocManager를 통해 설치합니다.
install.packages("BiocManager")
BiocManager::install("DESeq2")
실제 연구 환경에서는 패키지 버전이 중요합니다. 같은 코드라도 패키지 버전이 다르면 결과가 달라질 수 있으므로 환경 기록이 필요합니다.
DESeq2는 무엇을 하나요?
DESeq2는 RNA-seq에서 두 조건 사이에 발현량이 달라진 유전자를 찾는 데 자주 쓰입니다. 예를 들어 암 샘플과 정상 샘플을 비교해 어떤 유전자가 증가했거나 감소했는지 찾습니다.
입문 단계에서는 DESeq2 내부 수식을 외울 필요는 없습니다. 중요한 것은 “RNA-seq count 데이터를 받아서 정규화하고, 조건 간 차등발현 유전자를 찾는 도구”라는 점입니다.
Seurat는 무엇을 하나요?
Seurat는 single-cell RNA-seq 데이터를 분석할 때 많이 씁니다. 세포별 품질관리, 정규화, 차원축소, 클러스터링, 세포 유형 주석 같은 작업을 지원합니다.
즉, DESeq2가 bulk RNA-seq 차등발현에 자주 쓰인다면, Seurat는 세포 하나하나를 다루는 single-cell 분석에서 자주 쓰입니다.
파이썬과 R을 둘 다 알아야 하나요?
반드시 처음부터 둘 다 완벽히 할 필요는 없습니다. 하지만 계산생물학·생물정보학 연구자가 되려면 결국 둘 다 읽을 수 있어야 합니다. 논문 보충자료, 분석 스크립트, 연구실 코드에서 파이썬과 R이 섞여 나오는 일이 흔합니다.
초보자는 순서를 이렇게 잡으면 됩니다.
파이썬으로 파일과 표 처리 익히기
→ R로 통계와 생물정보 패키지 사용법 익히기
→ 필요한 분석마다 두 언어를 연결해서 쓰기
생물정보학에서 왜 중요한가
Bioconductor에는 유전체 좌표, RNA-seq, ChIP-seq, single-cell, pathway 분석을 위한 수많은 패키지가 있습니다. 많은 논문과 튜토리얼이 R 코드로 제공되므로, R을 읽고 실행할 수 있으면 연구 진입 장벽이 크게 낮아집니다.
Python과 R을 연결해서 읽는 감각
R과 Python은 문법은 다르지만 다루는 데이터 질문은 비슷합니다. 판다스에서 열을 꺼낼 때는 다음처럼 씁니다.
df["expression"]
R에서는 자주 다음처럼 씁니다.
df$expression
조건 필터링도 같은 질문을 다른 문법으로 표현한 것입니다.
df[df["expression"] >= 10]
df[df$expression >= 10, ]
Bioconductor는 단순 패키지 창고가 아니라 생물정보학 분석 생태계입니다. DESeq2는 count matrix와 sample metadata를 받아 차등발현을 분석하고, Seurat는 세포 × 유전자 행렬을 중심으로 single-cell 분석을 진행합니다.
초보자는 R을 처음부터 완벽히 외우기보다, 코드가 어떤 표를 입력으로 받고 어떤 결과표를 만드는지 읽는 훈련부터 하는 것이 좋습니다.
미니 실습 블록: R에서 metadata와 count table 확인하기
이 실습은 R에서 metadata와 count table 확인하기를 직접 손으로 확인하는 연습입니다. 왜 필요한가 하면, DESeq2 같은 Bioconductor 도구는 count matrix와 metadata의 샘플 연결이 매우 중요하기 때문입니다.
counts <- read.csv("counts.csv", row.names = 1)
metadata <- read.csv("metadata.csv")
print(head(counts))
print(head(metadata))
print(colnames(counts))
print(metadata$sample_id)
setdiff(colnames(counts), metadata$sample_id)
setdiff(metadata$sample_id, colnames(counts))
각 코드 요소의 의미를 풀어보면 다음과 같습니다. row.names = 1은 첫 번째 열을 행 이름으로 쓰라는 뜻입니다. metadata$sample_id는 sample_id 열을 꺼냅니다.
생물정보학/계산생물학에서 쓰이는 장면은 분명합니다. DESeq2, edgeR, limma-voom 같은 bulk RNA-seq 분석 도구 입력을 준비할 때 필요합니다.
흔한 오해 또는 주의점도 있습니다. 샘플 목록이 같아도 순서가 어긋나면 조건이 잘못 붙을 수 있으므로 순서까지 확인해야 합니다.
핵심 정리
R은 통계분석과 그래프 작성에 강한 언어이고, Bioconductor는 생물정보학 분석 패키지 생태계입니다. data.frame은 표 데이터, ggplot2는 시각화, DESeq2는 RNA-seq 차등발현, Seurat는 single-cell 분석에서 자주 쓰입니다.
문제 풀이
R과 Bioconductor
주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.
-
1. [쉬움] 객관식
R의 특징으로 가장 적절한 것은?
-
2. [쉬움] 객관식
Bioconductor의 설명으로 적절한 것은?
-
3. [코드] 객관식
R에서 변수에 값을 넣을 때 자주 쓰는 기호는?
-
4. [코드] 객관식
R에서
c(2, 4, 6, 8)은 무엇을 만드는가? -
5. [계산] 객관식
R 코드
mean(c(2,4,6,8))의 결과는? -
6. [쉬움] 객관식
R의
data.frame은 무엇을 나타내는가? -
7. [코드] 객관식
df$gene의 의미로 적절한 것은? -
8. [코드] 객관식
df[df$expression >= 10, ]의 의미는? -
9. [쉬움] 객관식
ggplot2의 주된 역할은?
-
10. [코드] 객관식
library(ggplot2)의 의미는? -
11. [코드] 객관식
BiocManager::install("DESeq2")는 무엇을 하는가? -
12. [보통] 객관식
DESeq2가 자주 쓰이는 분석은?
-
13. [보통] 객관식
Seurat가 자주 쓰이는 분석은?
-
14. [보통] 객관식
파이썬과 R을 모두 읽을 수 있으면 좋은 이유는?
-
15. [보통] 객관식
티디버스(tidyverse)의 설명으로 적절한 것은?
-
16. [계산] 객관식
R에서
x <- 10; y <- 20; x + y의 결과는? -
17. [보통] 객관식
R의 벡터와 파이썬/넘파이 배열의 공통점으로 적절한 것은?
-
18. [보통] 객관식
DESeq2를 처음 배울 때 가장 먼저 이해해야 할 점은?
-
19. [보통] 객관식
Seurat에서 자주 다루는 데이터 단위는?
-
20. [보통] 객관식
패키지 버전 기록이 중요한 이유는?
-
21. [중간] 객관식
R에서
df$expression의 의미로 가장 적절한 것은? -
22. [중간] 객관식
R 코드
df[df$expression >= 10, ]의 의미는? -
23. [중간] 객관식
DESeq2의 대표적 사용 상황으로 가장 적절한 것은?
-
24. [중간] 객관식
Seurat가 주로 쓰이는 분석 분야는?
-
25. [중간] 객관식
Bioconductor 패키지 설치에 자주 쓰이는 도구는?
-
26. [중간] 객관식
Python pandas의
df["expression"]과 가장 비슷한 R 표현은? -
27. [중간] 객관식
Bioconductor 분석에서 패키지 버전을 기록해야 하는 이유는?
-
28. [중간] 객관식
초보자가 R 코드를 읽을 때 먼저 확인할 질문으로 가장 적절한 것은?
-
29. [실전] 객관식
metadata$sample_id의 의미는? -
30. [실전] 객관식
DESeq2 입력에서 count matrix 열 순서와 metadata 행 순서가 어긋나면?
-
주관식 31. [실습] 주관식 · Gemini 채점
R에서 숫자 벡터
values <- c(2,4,6,8)의 평균을 구하는 코드를 작성하라. -
주관식 32. [실습] 주관식 · Gemini 채점
R에서 gene, expression 열을 가진 간단한 data.frame 예시를 작성하라.
-
주관식 33. [실습] 주관식 · Gemini 채점
df$expression이 무슨 뜻인지 설명하라. -
주관식 34. [실습] 주관식 · Gemini 채점
DESeq2와 Seurat의 차이를 간단히 설명하라.
-
주관식 35. [실습] 주관식 · Gemini 채점
Bioconductor가 생물정보학에서 중요한 이유를 설명하라.
-
주관식 36. [실습] 주관식 · Gemini 채점
초보자가 파이썬과 R을 함께 배울 때 권장되는 순서를 설명하라.
-
주관식 37. [실습] 주관식 · Gemini 채점
Python pandas와 R data.frame에서 expression 열을 꺼내는 문법을 비교해 설명하라.
-
주관식 38. [실습] 주관식 · Gemini 채점
DESeq2와 Seurat의 대표 사용 상황을 비교하라.
-
주관식 39. [실습] 주관식 · Gemini 채점
R에서
metadata.csv를 읽고 앞부분을 출력하는 코드를 작성하라. -
주관식 40. [실습] 주관식 · Gemini 채점
Python pandas의
df['sample_id']와 R의df$sample_id가 어떤 점에서 비슷한지 설명하라.