결론 먼저
ADsP에서 R은 실행 환경을 구축할 필요까지는 없고, 시험에 나오는 함수·문법을 "보면 뭐 하는 코드인지 읽을 수 있는 수준" 까지만 가면 됩니다.
| 영역 | 시험 출제 함수 |
|---|---|
| 변수·할당 | <-, =, assign() |
| 데이터 타입 | numeric, character, logical, factor |
| 벡터 | c(), seq(), rep(), 인덱싱 [] |
| 데이터프레임 | data.frame(), $, head(), summary() |
| 결측치 | NA, is.na(), na.rm=TRUE |
| 기본 통계 | mean(), sd(), var(), cor() |
이 6박스만 코드로 봤을 때 의미 해석되면 R 관련 문제는 다 풀려요.
왜 R 부분에서 점수가 갈리나
ADsP는 "R 코드를 직접 짜는" 시험이 아니라 "R 코드를 보고 결과를 묻는" 시험이에요. 그래서:
- 코드를 한 줄씩 따라가며 결과를 머릿속에서 시뮬레이션할 수 있어야 함
- 함수 이름과 인자 의미를 외워야 함
- 인덱싱 결과 행/열 수를 직접 세야 함
비전공자가 가장 헤매는 건 벡터 인덱싱과 결측치 처리 두 영역. 거기서 매회 1–2문제 빠지는 경우 흔합니다.
R은 "코드 작성" 이 아니라 "코드 읽기" 가 시험 목표예요. 손코딩으로 작성해보지 말고, 눈으로 읽고 결과 맞추는 연습 위주로.1. 변수 할당
R의 할당 기호는 4가지가 있어요. ADsP에서는 <- 가 가장 자주 나옵니다.
x <- 10 # 가장 일반적
y = 20 # 함수 인자처럼 보일 수 있어 비추
z <<- 30 # 전역 할당 (함수 안에서)
assign("w", 40) # 함수형 할당
<- 와 = 는 거의 동일하지만, 함수 인자에서는 = 만 쓸 수 있다는 차이가 있어요. (mean(x = c(1,2,3)))
2. 데이터 타입과 형변환
| 타입 | 예시 | 확인 함수 | 변환 함수 |
|---|---|---|---|
| numeric | 1.5, 100 | is.numeric() | as.numeric() |
| integer | 5L | is.integer() | as.integer() |
| character | "ABC" | is.character() | as.character() |
| logical | TRUE, FALSE | is.logical() | as.logical() |
| factor | factor(c("a","b","a")) | is.factor() | as.factor() |
특히 factor 는 ADsP 단골이에요. 범주형 변수를 표현하는 타입이고 회귀 분석에서 가변수(dummy variable) 자동 처리 됩니다.
x <- factor(c("low", "mid", "high"), levels = c("low", "mid", "high"))
levels(x) # "low" "mid" "high"
levels 는 가능한 값의 집합. 순서를 명시하면 ordered factor.
3. 벡터 (Vector)
R의 가장 기본 자료구조. 모든 원소가 같은 타입이어야 해요.
# 생성
v1 <- c(1, 2, 3, 4, 5)
v2 <- 1:10 # 1부터 10까지
v3 <- seq(1, 10, by = 2) # 1, 3, 5, 7, 9
v4 <- rep(1, times = 3) # 1 1 1
# 인덱싱
v1[1] # 첫 번째 (R은 1부터)
v1[2:4] # 2-4번째
v1[-1] # 첫 번째 제외 (음수는 제외)
v1[c(1,3)] # 1번째와 3번째
v1[v1 > 3] # 조건 인덱싱
함정: R 인덱스는 0이 아니라 1부터 시작. 파이썬 익힌 사람이 자주 헷갈려요.
음수 인덱싱은 "이 위치를 제외" 라는 의미. 파이썬의 음수와 다릅니다.
4. 데이터프레임 (Data Frame)
가장 자주 쓰이는 구조. 각 열은 다른 타입 가능.
df <- data.frame(
name = c("A", "B", "C"),
age = c(20, 30, 40),
pass = c(TRUE, FALSE, TRUE)
)
# 접근
df$name # name 열 (벡터로 반환)
df[, "name"] # 동일
df[1, ] # 첫 번째 행
df[df$age >= 30, ] # age >= 30 행만
# 요약
head(df) # 앞 6행
str(df) # 구조
summary(df) # 요약 통계
nrow(df); ncol(df) # 행/열 수
$ 는 데이터프레임의 열 접근 연산자. ADsP 코드 문제에서 자주 보이는 표현이에요.
5. 결측치 (NA) 처리
NULL과 NA를 헷갈리는 경우가 많은데 다릅니다.
| 값 | 의미 |
|---|---|
NA | 결측치 (Not Available) — 값이 있어야 하는데 없음 |
NULL | 객체 자체가 없음 |
NaN | Not a Number (0/0 같은 결과) |
Inf | 무한대 |
결측치 확인·제거
x <- c(1, 2, NA, 4, NA)
is.na(x) # FALSE FALSE TRUE FALSE TRUE
sum(is.na(x)) # 2 (결측치 개수)
x[!is.na(x)] # NA 제외한 벡터
mean(x) # NA (NA 포함하면 결과도 NA)
mean(x, na.rm = TRUE) # 2.333... (NA 무시 평균)
na.rm = TRUE 는 거의 모든 통계 함수에 들어가요. ADsP 단골 인자.
결측치 대체
x[is.na(x)] <- 0 # NA 를 0으로 대체
또는 평균·중위값 대체:
x[is.na(x)] <- mean(x, na.rm = TRUE)
6. 기본 통계 함수
| 함수 | 기능 | NA 영향 |
|---|---|---|
mean(x) | 산술평균 | NA 있으면 결과 NA |
median(x) | 중위값 | 동일 |
var(x) | 분산 | 동일 |
sd(x) | 표준편차 | 동일 |
cor(x, y) | 상관계수 | 동일 |
summary(x) | 6수치 요약 (Min/1Q/Median/Mean/3Q/Max) | NA 있으면 NA's 표시 |
→ 거의 다 na.rm = TRUE 인자 받습니다. 결측치 있는 데이터에서는 항상 추가하세요.
mean(x, na.rm = TRUE)
sd(x, na.rm = TRUE)
cor(x, y, use = "complete.obs") # cor 는 use 인자
cor 는 na.rm 대신 use 인자 사용. "complete.obs" 는 NA 행 제거 후 계산.
7. 코드 읽기 연습 — 시험 단골 패턴
문제 1
v <- c(1, 2, 3, 4, 5)
v[v %% 2 == 0]
→ %% 는 나머지 연산자. 짝수만 → 2 4.
문제 2
df <- data.frame(x = c(1,2,3,NA,5))
mean(df$x)
mean(df$x, na.rm = TRUE)
→ 첫 결과 NA, 두 번째 (1+2+3+5)/4 = 2.75.
문제 3
x <- c("A", "B", "A", "C", "A")
table(x)
→ 빈도 집계: A=3, B=1, C=1. table() 은 도수분포표 함수.
자주 틀리는 5가지 패턴
1. 인덱스 0부터 시작 착각 파이썬 출신이 자주 실수. R은 1부터 시작.
2. NA 포함 평균 = 0 으로 착각
NA 포함하면 결과는 NA (0이 아님). na.rm=TRUE 추가 필요.
3. 음수 인덱스 의미 헷갈림 R 음수는 "제외", 파이썬 음수는 "뒤에서부터".
4. NA vs NULL vs NaN 혼동
- NA: 결측치 (값 없음)
- NULL: 객체 없음
- NaN: 수학 정의 안 됨 (0/0)
5. factor 와 character 헷갈림 factor 는 범주형 (수준 levels 정해짐), character 는 자유 문자열. 회귀 분석에서 동작 다름.
시험장에서의 접근법
- R 코드 보면 한 줄씩 머릿속에서 실행:
v <- c(1,2,3)→ 벡터 생성 - 인덱싱 시 R은 1부터 라는 것 항상 상기
- 결측치 보이면
na.rm=TRUE인자 확인 - 자료형 확인 함수(
is.numeric,is.factor)와 변환 함수(as.numeric) 헷갈리지 말 것
정리
- R 인덱스는 1부터, 음수는 "제외"
- 벡터: 같은 타입만,
c() seq() rep() - 데이터프레임: 다른 타입 가능,
$로 열 접근 - NA: 결측치, 통계 함수에
na.rm = TRUE필수 - factor: 범주형 변수, levels 로 수준 지정
- summary(): 6수치 요약, NA 개수 표시