1. 입력과 출력
1-1. 데이터 분석 과정
입력(Input) → 전처리/재구성(Handling) → 출력(Output)
- 입력: 분석 목적에 맞게 “설계된 형태”로 데이터를 정확히 가져오기
- 핸들링: 분석 가능한 구조로 재정리(결측/형변환/조인/집계 등)
- 출력: 결과를 보고서/그래프/파일로 “해석 가능한 형태”로 뽑기
1-2. R에서 가능한 입력/출력의 범위
- CSV/TSV 같은 텍스트 데이터
- DB에서 뽑은 데이터
- 다른 통계 프로그램 결과물
자릿수(출력 포맷) 컨트롤
options(digits = 10) # 출력 유효숫자 늘리기
getOption("digits") # 현재 설정 확인
문자열을 파일로 저장하고 싶을 때
cat("저장할 문자열", file = "result.txt")
파일 경로에서 자주 터지는 포인트
read.csv("C:/data/sample.csv")
read.csv("C:\\data\\sample.csv")
1-3. 외부 파일 입력/출력
| 고정자리 변수 파일 | read.fwf(”파일명”, width=c(w1, w2, …)) |
| 구분자 변수 파일 | read.table(”파일명”, sep=”구분자”) |
| csv 파일 읽기 | read.csv(”파일명”, header=T) # 1행이 변수인 경우 : header = T |
| csv 파일 출력 | write.csv(데이터프레임, “파일명”) |
1-4. 웹/서버에서 데이터 읽어오기
| 파일 다운로드 | read.csv(”주소.csv”) |
| ftp에서 파일 다운로드 | read.csv(”ftp://주소.csv”) |
| html에서 테이블 | readHTMLTable(”url”) |
2. 데이터 구조와 데이터 프레임
2-1. 데이터 구조 3대장 비교
| 특징 | 벡터 | 리스트 | 데이터프레임 |
| 원소 자료형 | 동질적 (전부숫자/전부문자) |
이질적 | 이질적 |
| 원소를 위치로 인덱싱 | 가능 | 가능 | 가능 |
| 인덱싱으로 여러 개 원소로 구성된 하위 데이터 생성 | 가능 | 가능 | 가능 |
| 원소들에 이름 부여 | 가능 | 가능 | 가능 |
2-2. 데이터프레임
- 데이터프레임은 “표” 형태
- 각 열(column)은 벡터 또는 요인(factor)
- 모든 열의 길이는 동일
- 열마다 자료형이 달라도 됨(숫자/문자/범주 혼합 가능)
2-3. 그 밖의 데이터 구조
- 스칼라(Scalar): R에서는 원소 1개짜리 벡터로 취급
- 행렬(Matrix): 차원을 가진 벡터(텍스트 마이닝, SNA에서 많이 씀)
- 배열(Array): 행렬의 n차원 확장
- 요인(Factor): 범주형 변수(레벨/그룹), 집단 분석에 필수
2-4. 벡터/리스트/행렬 다루기에서 많이 나오는 개념
1) 재활용 규칙
길이가 다른 벡터끼리 연산하면 짧은 벡터가 반복 재사용됩니다.
c(1,2,3,4) + c(10,20) # 10,20,10,20 으로 반복
2) 리스트 원소 선택
- L[[n]] : 원소 자체
- L[n] : 리스트 형태로 반환
- L$name / L[["name"]] : 이름으로 선택
3) 행렬 만들기/차원 지정
dim(vec) <- c(2, 3) # 벡터를 2x3 형태로
rownames(m) <- c("row1","row2")
colnames(m) <- c("c1","c2","c3")
3. 데이터프레임 실무 기능 모음
3-1. 생성/결합
df <- data.frame(v1, v2, v3)
new <- data.frame(a=1, b=2, c=3, d="a") # 숫자+문자 같이 가능
rbind(df1, df2) # 행 결합
cbind(df1, df2) # 열 결합
대용량 틀 먼저 만들기(미리 할당)
N <- 1000000
dtfm <- data.frame(
dosage = numeric(N),
lab = character(N),
response = numeric(N)
)
3-2. 조회/필터링
dfrm[dfrm$gender == "m", ] # 남성만
dfrm[dfrm$var1 > 4 & dfrm$var2 > 5, c("var3","var4")] #데이터셋의 변수1과 변수2의 조건에 만족하는 레코드의 변수3과 변수 4만을 조회
dfrm[grep("문자", dfrm$var1, ignore.case = TRUE), c("var2","var3")] #데이터셋의 변수1 내 “문자”가 들어 있는 케이스들의 변수2, 변수3값을 조회
subset(dfrm, select = c(var3, var4), subset = (var1 > 4 & var2 > 5)) #데이터셋의 특정변수의 값이 조건에 맞는 변수셋 조회, subset은 벡터와 리스트에서도 선택 가능
3-3. 병합(조인)
merge(df1, df2, by = "공통키")
merge(df1, df2, by = "공통키", all = TRUE) # outer join 느낌
3-4. 결측치 처리 / 컬럼명
colnames(df)
colnames(df) <- newnames
NA_clean <- na.omit(df)
4. 데이터 구조 변경
- 벡터 → 리스트: as.list(vec)
- 리스트 → 벡터: unlist(lst)
- 데이터프레임 → 리스트: as.list(df)
- 데이터프레임 → 행렬: as.matrix(df)
- 행렬 → 데이터프레임: as.data.frame(mat)
예시로 감 잡기:
as.data.frame(vec) # 1열 DF
as.data.frame(rbind(vec)) # 1행 DF
5. 데이터 변형: split/apply 계열만 잡아도 생산성 폭발
5-1. 집단으로 나누기(split)
v <- c(24,23,52,46,75,25)
f <- factor(c("A","A","B","B","C","A"))
groups <- split(v, f)
5-2. 함수 적용 “3총사”
- 리스트: lapply(), sapply()
- 행렬/배열: apply()
lapply(lst, func) # 리스트로 반환
sapply(lst, func) # 벡터/행렬로 단순화 반환
apply(mat, 1, func) # 행 기준
apply(mat, 2, func) # 열 기준
5-3. 집단별 집계(tapply, by)
tapply(vec, fac, mean)
by(dfm, fac, summary)
5-4. 여러 입력에 병렬 적용(mapply)
mapply(func, vec1, vec2, vec3) #벡터
mapply(func, lst1, lst2, lst3) #리스트
6. 문자열 다루기
- 문자열 길이: nchar("문자열")
- 벡터 길이: length(vec)
- 문자열 연결: paste("단어", "문장", scalar)
- 부분 문자열: substr("문자열", start, stop)
- 분리: strsplit("a,b,c", ",")
- 치환: sub(), gsub()
날짜 처리
as.Date("2014-12-25")
as.Date("12/25/2014", format = "%m/%d/%Y")
format(Sys.Date(), format = "%m/%d/%Y")
format 주요 코드
- %b 축약 월(Jan), %B 전체 월(January)
- %d 일(2자리), %m 월(2자리)
- %y 연(2자리), %Y 연(4자리)
마지막: 실무에서 “입력/구조”로 사고 나는 TOP 3
- 경로에 \ 써서 파일 못 읽음 → / 또는 \\ 쓰기
- 조건식에 = 써서 필터가 이상함 → 비교는 ==
- 데이터프레임/리스트 인덱싱 헷갈림 → [[ ]]는 원소, [ ]는 묶음
'Study Log > ADP' 카테고리의 다른 글
| [ADP 필기 요약]_4과목 데이터 분석_④ (0) | 2026.03.10 |
|---|---|
| [ADP 필기 요약]_4과목 데이터 분석_③ (0) | 2026.03.03 |
| [ADP 필기 요약]_4과목 데이터 분석_① (0) | 2026.02.26 |
| [ADP 필기 요약]_3과목 데이터 분석 기획_③ (0) | 2026.02.23 |
| [ADP 필기 요약]_3과목 데이터 분석 기획_② (0) | 2026.02.20 |