R 공식 문서: 개념, 예제, 실습
예제 중심의 간결한 R 레퍼런스. 개념을 읽고 코드를 본 뒤 Coddy 여정에서 직접 연습하세요.
시작하기
- R이란?R 프로그래밍 언어가 무엇이고, 어디에서 시작되었으며, 어떤 용도로 쓰이고, Python과 어떻게 다른지 알아봅니다. 바로 실행할 수 있는 첫 R 코드도 함께 살펴봅니다.
- R 설치CRAN에서 R을 내려받아 Windows, macOS, Linux에 설치하는 방법과, 거의 모든 사람이 R을 작성할 때 사용하는 IDE인 RStudio를 설치하는 방법입니다.
- R 스크립트 실행R 코드를 실행하는 모든 방법입니다. 대화형 콘솔, 명령줄의 Rscript, R 안에서 쓰는 source(), 그리고 RStudio의 Run과 Source 명령을 다룹니다.
- R 문법R 문법의 핵심입니다. <-를 사용한 할당, 표현식과 자동 출력, 이름 있는 인자를 사용하는 함수 호출, 그리고 모든 것이 벡터라는 규칙을 다룹니다.
- 주석R에서 주석이 동작하는 방식입니다. # 기호, R에 진짜 여러 줄 주석이 없는 이유, 블록을 주석 처리하는 RStudio 단축키, 그리고 좋은 주석이 담아야 할 내용을 다룹니다.
변수와 데이터
- 변수R에서 <- 화살표로 변수를 만드는 방법, 대신 =가 필요한 경우, 이름 짓기 규칙, 그리고 ls()와 rm()으로 변수를 확인하고 제거하는 방법을 다룹니다.
- 데이터 타입R의 원자적 데이터 타입인 double, integer, character, logical과 함께 typeof()와 class()의 차이, 그리고 변환과 강제 변환이 동작하는 방식을 다룹니다.
- 숫자R에서 숫자를 다루는 방법입니다. numeric과 integer의 차이, 반올림 함수들, sqrt와 log, %% 나머지 연산자, 그리고 특수값 Inf와 NaN을 다룹니다.
- 문자열R에서 텍스트를 다루는 데 필요한 모든 것입니다. 문자열 만들기, paste와 paste0로 붙이기, sprintf로 서식 지정하기, gsub·grepl·strsplit로 검색하기를 다룹니다.
- 입력과 출력R에서 출력이 동작하는 방식(자동 출력, print()와 cat()의 차이, message())과 readline() 및 readLines()로 사용자 입력을 읽는 방법을 다룹니다.
제어 흐름
- 연산자R에서 필요한 모든 연산자입니다. %%와 %/%를 포함한 산술 연산, 벡터화된 비교, &와 &&의 차이, 그리고 포함 여부를 검사하는 %in%을 다룹니다.
- if / elseR의 조건 논리입니다. if/else if/else 문법, 스크립트를 깨뜨리는 중괄호 함정, 벡터 전체에 쓰는 벡터화된 ifelse(), 그리고 다중 분기를 위한 switch()를 다룹니다.
- for 반복문R에서 for 반복문이 동작하는 방식입니다. 벡터와 인덱스 순회, 벡터를 키우는 함정 없이 결과 모으기, next와 break, 그리고 벡터화 호출이 반복문보다 나은 때를 다룹니다.
- while 반복문R에서 while 반복문이 동작하는 방식입니다. 조건을 먼저 검사하는 반복, R의 do-while 역할을 하는 repeat와 break, next, 그리고 무한 루프를 피하는 습관을 다룹니다.
자료 구조
- 벡터벡터는 R의 기본 단위입니다. 숫자 하나조차 벡터입니다. c()로 만들고, (1부터!) 인덱싱하고, 논리 마스크로 걸러 내고, 벡터 전체에 한 번에 계산하는 방법을 다룹니다.
- 리스트리스트는 무엇이든 담는 R의 컨테이너입니다. 섞인 타입, 중첩 구조, 데이터 프레임 전체까지 담습니다. 핵심 기술은 [가 더 작은 리스트를 돌려주는 때와 [[가 원소 자체를 돌려주는 때를 아는 것입니다.
- 행렬matrix(), cbind(), rbind()로 행렬을 만들고, 행과 열을 인덱싱하고, 원소 단위 *와 진짜 행렬 곱셈 %*%를 구분하는 방법을 다룹니다.
- 팩터팩터는 R이 범주형 데이터를 저장하는 방식으로, 텍스트 라벨을 입은 정수 코드입니다. 팩터를 만들고, 순서를 부여하고, 기준 수준을 정하고, 팩터→숫자 변환 함정을 피하는 방법을 다룹니다.
- 데이터 프레임데이터 프레임은 R의 스프레드시트입니다. 길이가 같고 이름이 붙은 열들이 각자의 타입을 가집니다. 만드는 법, str()과 head()로 규모를 파악하는 법, 열·행·셀에 접근하는 법을 다룹니다.
- 결측값 (NA)NA는 "알 수 없음"을 뜻하며, 닿는 모든 계산으로 퍼져 나갑니다. is.na()로 탐지하고, na.rm = TRUE로 건너뛰고, 의도적으로 제거하거나 대체하는 방법을 다룹니다.
함수와 패키지
- 함수R에서 함수를 만드는 방법입니다. function(x) { } 문법, 반환값, 기본 인자와 이름 있는 인자, ... 점 세 개, 익명 함수, 그리고 스코프가 동작하는 방식을 다룹니다.
- apply 계열apply, lapply, sapply, vapply, mapply, tapply로 이루어진 apply 계열은 데이터의 모든 원소에 함수를 실행합니다. 각각이 무엇을 하고 언제 써야 하는지 살펴봅니다.
- 파이프%>%가 무엇을 뜻하는지, 기본 R의 네이티브 파이프 |>가 어떻게 동작하는지, 각각의 규칙과 자리표시자는 무엇인지, 그리고 새 코드에는 어느 쪽을 써야 하는지 다룹니다.
- 패키지R 패키지가 동작하는 방식입니다. install.packages()로 CRAN에서 설치하기, library()로 불러오기, require()와 library()의 차이, pkg::fun(), 그리고 알아 둘 만한 패키지들을 다룹니다.
- 작업 디렉터리R이 파일을 어디에서 찾는지와 그것을 제어하는 방법입니다. getwd(), setwd(), list.files(), rm(list = ls())로 환경 비우기, 그리고 .RData 자동 저장이 왜 함정인지 다룹니다.
데이터 가공
- dplyrdplyr이 무엇인지, 어떻게 설치하는지, 그리고 여섯 개의 핵심 동사와 파이프가 어떻게 지저분한 데이터 프레임 코드를 읽기 좋은 파이프라인으로 바꾸는지 다룹니다.
- 필터링 & 부분집합원하는 행과 열만 남기는 모든 방법: 대괄호와 논리 마스크, subset() 한 줄 표현, %in%, NA 함정, 그리고 dplyr의 filter()와 select().
- 열 추가 (mutate)데이터 프레임의 열을 추가하고 변형하고 삭제하는 방법: df$new <- ..., 조건부 열을 만드는 ifelse(), transform(), 그리고 case_when()과 함께 쓰는 dplyr의 mutate().
- 열 이름 변경R에서 데이터 프레임의 열 이름 바꾸기: names()와 colnames(), 위치 기준 vs 이름 기준 변경, setNames(), dplyr rename(), 그리고 지저분한 임포트 헤더 정리하기.
- 정렬R에서 정렬이 실제로 동작하는 방식: 벡터를 위한 sort(), 데이터 프레임에 order()의 인덱스 기법이 필요한 이유, 내림차순과 다중 열 정렬, 그리고 dplyr의 arrange().
- 그룹화 & 요약R에서 그룹별 통계를 계산하는 모든 방법: table()로 세기, 그룹당 통계 하나를 구하는 tapply(), aggregate()의 수식 인터페이스, 그리고 dplyr의 group_by()와 summarize().
- 병합 & 조인공통 키로 데이터 프레임 결합하기: 내부·왼쪽·오른쪽·완전 조인을 위한 merge(), by.x/by.y로 서로 다른 키 이름 다루기, dplyr의 조인 계열, 그리고 행을 쌓는 rbind().
- 피벗 (재구조화)넓은 형식과 긴 형식, 그리고 둘 사이를 변환하는 방법: tidyr의 pivot_longer()와 pivot_wider(), 예전 이름인 spread/gather, 그리고 base R의 reshape().
가져오기와 내보내기
- CSV 읽기read.csv()로 CSV 파일을 R에 불러오는 방법 - 중요한 인자들, 대부분의 실패를 일으키는 작업 디렉터리 함정, 그리고 readr::read_csv가 값어치를 하는 시점.
- 엑셀 읽기R은 혼자서는 .xlsx 파일을 열 수 없습니다 - readxl 패키지가 그 빈틈을 메웁니다. 시트, 범위, 헤더를 읽는 방법, 엑셀로 다시 내보내는 방법, 그리고 전형적인 엑셀 임포트 함정을 피하는 법.
- CSV & RDS 쓰기R에서 내보내기: 언제나 row.names = FALSE와 함께 쓰는 write.csv, 다른 구분자를 위한 write.table, 그리고 타입을 잃지 않는 왕복 저장을 위한 saveRDS.
- 날짜R의 Date 클래스는 분장을 한 일수 카운트입니다. as.Date로 문자열을 파싱하고, 출력용으로 날짜 서식을 지정하고, 날짜를 빼고, 수열을 만드는 법, 그리고 대신 POSIXct가 필요한 시점.
그래프
- plot()R의 plot() 함수가 동작하는 방식 - 그래프 유형, 제목과 축 라벨, 색상, 점 기호(pch), lines()와 abline()으로 겹쳐 그리기, 그리고 범례.
- 히스토그램R에서 hist()로 히스토그램 만드는 방법 - 구간(breaks) 고르기, 막대 꾸미기, 밀도 척도로 전환하기, 정규 곡선 겹쳐 그리기, 그리고 ggplot2 버전.
- 상자그림R에서 boxplot()으로 상자그림 만드는 방법 - 상자와 수염 읽기, 그룹 비교를 위한 수식 인터페이스, 스타일 지정, 그리고 그 뒤의 숫자 확인하기.
- 산점도R에서 산점도 만드는 방법 - plot()으로 두 변수 그리기, abline(lm())으로 회귀선 추가하기, lowess()로 평활하기, 그리고 pairs() 행렬 만들기.
- 막대그래프R에서 barplot()으로 막대그래프 만드는 방법 - 이름 있는 벡터나 table()에서 시작하기, 행렬로 만드는 그룹형·누적형 막대, 스타일 지정, 그리고 geom_col과 geom_bar의 차이.
- ggplot2ggplot2가 동작하는 방식 - 데이터 + aes() + geom이라는 사고 모형, 매핑과 설정의 차이, labs(), facet_wrap(), 테마, 그리고 ggsave()로 그래프 저장하기.
통계
- 기술통계R에서 데이터를 요약하는 방법: mean(), median(), sd(), var(), summary(), quantile() - 각각이 무엇을 계산하는지, sd() 뒤의 n−1 세부 사항, 그리고 R의 mode()가 함정인 이유.
- 상관분석cor()으로 두 변수가 함께 움직이는 정도를 측정하고, cor.test()로 그 관계가 실재하는지 검정하며, 상관행렬로 여러 변수를 한 번에 훑어보세요.
- t-검정t.test()로 일표본, 이표본, 대응표본 t-검정을 수행하고 - 정말 중요한 부분인 - 출력의 모든 줄을 읽어 보세요: t, 자유도, p값, 신뢰구간.
- 분산분석aov()로 셋 이상 그룹의 평균을 비교하고, 분산분석표를 칸 단위로 읽고, TukeyHSD()로 실제로 어떤 그룹이 다른지 찾아보세요.
- 선형회귀lm()으로 회귀모형을 적합하고, summary()의 모든 블록 - 계수, 표준오차, p값, 결정계수, F 통계량 - 을 읽고, predict()로 예측해 보세요.
- 로지스틱 회귀glm(family = binomial)으로 예/아니오 결과를 모형화하세요: summary 읽기, exp()로 로그오즈 계수를 오즈비로 변환하기, 그리고 예측 확률을 올바르게 얻기.
- 신뢰구간평균, 비율, 모형 계수의 신뢰구간 구하기 - t.test(), prop.test(), confint() - 그리고 "95% 신뢰"가 실제로 무엇을 뜻하는지와 표본 크기가 구간 폭을 어떻게 좌우하는지.
- 난수rnorm(), runif(), rbinom(), sample()로 무작위 데이터를 만들고, set.seed()로 재현 가능하게 만들며, 분포에 붙는 R의 d/p/q/r 명명 체계를 해독해 보세요.