1. R 소개
1. R의 탄생
- R은 오픈 소스 프로그램으로 통계/데이터마이닝과 그래프를 위한 언어이다.
- 다양한 최신 통계 분석과 마이닝 기능을 제공한다.
- 세계적으로 많은 사용자들이 다양한 예제를 공유한다.
- 다양한 기능을 지원하는 많은 패키지가 수시로 업데이트 된다.
| SAS | SPSS | R | PYTHON | |
| 프로그램 비용 | 유료, 고가 | 유료, 고가 | 오픈소스 | 오픈소스 |
| 설치용량 | 대용량 | 대용량 | 모듈화로 간단 | 모듈화로 간단 |
| 다양한 모듈 지원 및 비용 | 별도구매 | 별도구매 | 오픈소스 | 오픈소스 |
| 최근 알고리즘 및 기술 반영 | 느림 | 다소 느림 | 빠름 | 매우 빠름 |
| 학습자료 입수의 편의성 | 유료 도서 위주 | 유료 도서 위주 | 공개 논문 및 자료 많음 | 공개 논문 및 자료 매우 많음 |
| 질의를 위한 공개 커뮤니티 | - | - | 활발 | 매우 활발 |
💡R의 특징
- 오픈소스 프로그램이다.
- 다양한 함수와 패키지를 제공한다.
- 매번 데이터를 로딩할 필요가 없으며, 명령어 히스토리도 저장 가능하다.모든 운영체제에서 사용가능하다.
2. R Studio
- 오픈소스이며 다양한 운영체계를 지원한다.
- R Studio는 메모리에 변수가 어떻게 되어 있는지와 타입이 무엇인지를 볼 수 있고, 스크립트 관리와 도큐먼테이션이 편리하다.
- 코딩을 해야 하는 부담이 있으나, 스크립트용 프로그래밍으로 어렵지 않게 자동화가 가능하다.
R 사용법
1. 설치하기
💡R의 작업환경작업 환경은 업무 규모와 본인에게 익숙한 환경이 무엇인지를 기준으로 선택한다.
기업 환경에서는 64BIT 환경의 듀얼 코어, 32GB RAM, 2TB 디스크, 리눅스 운영체제를 추천한다.
- R 프로그램 설치하기
- R 프로그램은 www.r-project.org에서 아래와 같은 절차로 다운로드가 가능하다.
- R STUDIO 설치하기
- R STUDIO는 https://posit.co/에서 아래와 같은 절차로 다운로드 가능하다.
2. 인터페이스
- R 인터페이스
- R의 기본 화면에는 콘솔창(R CONSOLE)이 제공된다.
- 콘솔(CONSOLE): R CODE와 실행 결과가 제공되며, 콘솔에 명령어를 직접 입력하는 것이 가능하나 권장하지는 않는다.
- [파일]→ [새 스크립트] 메뉴를 통해 스크립트 창 생성이 가능하다.
- 스크립트창(R 편집기)은 R 명령어를 생성하고 저장하는 공간이다.
- → 아마 추가 옵션을 선택하지 않고 R을 설치했다면 바탕화면에 R 아이콘이 뜰 것이다. 그게 아니라면 메뉴에서 직접 검색해서 실행시켜 보면 인터페이스가 열릴 것이다.
- R STUDIO 인터페이스
- R STUDIO는 통계 분석과 데이터 처리르 위한 프로그래밍 언어인 R으 사용하는데 최적화된 통합 개발 환경(IDE)이다. 사용자 친화적인 인터페이스, 코드 자동완성, 문서화 기능 등 R 사용자를 위한 유용한 도구이다.
3. R 다루기
- 패키지 사용하기
- 함수, 데이터, 컴파일된 코드의 모음을 패키지(PACKAGE)라고 하며, R은 다양한 분석 기능과 알고리즘을 지원하는 방대한 패키지를 제공하고 있다. 패키지 설치와 로드의 과정을 거친 후 사용이 가능하다.
- 패키지는 R 콘솔창에서 함수를 통해 불러올 수 있지만, 웹에서 직접 설치하는 것도 가능하다.
기능 함수 R CODE예시 패키지 설치 install.packages(”패키지명”) install.packages(”dplyr”) 패키지 로드 library(패키지명) library(dplyr) 패키지 업데이트 update.packages(”패키지명”) update.packages(”dplyr”) 설치된 패키지 목록 확인 installed.pacakges() as.data.frame(installed.packages()[,c(3:4)])
- 스크립트 다루기
| 기능 | 단축키/ R CODE |
| R CODE 실행 | • 한 줄 실행: CTRL+R 혹은 CTRL+ENTER 혹은 F5 |
| • 여러 줄 실행: 드래그 후, CTRL + R 혹은 F5, SOURCE클릭 | |
| 스크립트 저장 | 스크립트에 커서를 둔 상태에서 메뉴를 통해 저장 혹은 CTRL+S |
| 주석달기 | 스크립트 한 줄 제일 앞 클릭 후 #, 스크립트 영역 지정 후 CTRL+SHIFT+C |
| 도움말 | ?함수명, HELP(함수명), RSiteSerch(”함수명”) |
| - 편리한 기능 |
| 기능 | R CODE |
| 현재 작업 중인 폴더의 경로(주소) 산출 | getwd() |
| 작업 폴더를 새로 지정 | setwd(”사용자 지정 작업 디렉토리”) |
| 현재 작업 중인 폴더에 있는 파일 목록 산출 | dir() |
| 파일 이름 확인하기 | list.files() |
| 변수 목록 보기 | ls() |
| 메모리의 모든 객체 삭제 | rm(list=ls()) |
| R 종료 | q() |
| 명령어의 끝을 암시 | ; |
| 출력 | print() |
| R 스크립트 실행 | source(”스크립트 파일명”) |
| 콘솔에 출력되는 텍스트를 텍스트 파일로 저장 | sink(”저장될 파일명”) |
| R에서 생성된 그래프를 PDF 파일로 저장 | pdf(”저장될 파일명”) |
| 그래프 생성을 마친 후, pdf 장치 닫기 | dev.off() |
4. R 기초 중에 기초
- 변수 생성
- R에서는 변수명을 선언하고 값을 할당하면 데이터 타입을 스스로 인식하고 선언한다.
- 변수에 값을 할당할때는 대입 연산자(←, <←, =, →, →>)를 사용하지만, <← 연산자는 전역 변수에 값을 할당할 때 사용하므로, ← 연산자의 사용을 가장 권장한다.
- EX) name←”Jane”; #name 변수에 Jane이라는 문자 할당
- EX) number ← c(1,2,3); #number 변수에 숫자 1,2,3을 할당
- 💡R에서 변수는 데이터를 저장하는 이름을 가진 공간, 변수에 저장된 값은 변수 이름을 통해 참조할 수 있으며, 변수가 정의된 위치에 따라 전역(global)변수와 지역(local)변수가 있다. 전역 변수는 전체 스크립트에서 접근할 수 있지만, 지역 변수는 특정 함수 내에서 만 유효하다.
- 변수명 규칙
- R에서 변수 이름을 지정할 때는 아래와 같은 규칙을 지켜야한다.
- 변수명에는 알파멧, 숫자, _(언더스코어), .(마침표)를 사용할 수 있다.
- 첫 글자는 마침표 혹은 알파벳으로 시작이 가능하며, 마침표로 시작할 경우 마침표 뒤에는 숫자가 올 수 없다.
- -(하이픈)은 변수명에 사용할 수 없다.
- 올바른 변수명 EX) x,y,abc_1,efg.2
- 잘못된 변수명 EX) 1a, .3, x-y
- R에서 변수 이름을 지정할 때는 아래와 같은 규칙을 지켜야한다.
- R의 기초 연산자
| 연산자 우선 순위 | 뜻 | 표현 방법 및 설명 |
| ^ | 지수 | 5^2 |
| +,- | 단항 플러스와 마이너스 부호 | +3,-5 |
| : | 수열 생성 | 1:30 |
| %any% | 특수 연산자 | • %/%: 나눗셈의 몫 • %%: 나눗셈의 나머지 • %*%: 행렬곱 |
| *,/ | 곱하기, 나누기 | 2*5,10/2 |
| +,- | 더하기, 빼기 | 5+2,+-3 |
| == | 좌우의 값이 같은지 비교하여 TRUE/ FALSE로 변환 | 3==5 |
| !=, <> | 좌우의 값이 다른지 비교하여 TRUE/ FALSE로 변환 | 3!=5, 3<>5 |
| >=,<= | 크거나 같다, 작거나 같다를 비교하여 TRUE/FALSE로 변환 | 3<=5 |
| ! | 논리 부정 | !(3==4) |
| &,&& | 논리 AND | • &: 논리 연산 데이터가 하나 이상인 경우에 사용 • &&: 논리 연산 데이터가 하나인 경우에 사용 |
| |,|| | 논리 OR | • |: 논리 연산 데이터가 하나 이상인 경우에 사용 • ||: 논리 연산 데이터가 하나인 경우에 사용 |
| ~ | 식(formula) | 종속 변수1+종속 변수2… ~ 독립 변수1 +독립 변수2.. |
| →, →> | 왼쪽 값을 오른쪽으로 대입 | 3→a, 3→> a |
| =,←,<← | 오른쪽 값을 왼쪽으로 대입 | a=3,a←3,a<←3 |
- R을 활용한 기초 통계란 계산
| 기능 | R코드 | 비고 |
| 평균 | mean(변수) | 변수의 평균 산출 |
| 합계 | sum(변수) | 변수의 합계 산출 |
| 중앙값 | median(변수) | 변수의 중앙값 산출 |
| 로그 | log(변수) | 변수의 로그값 산출 |
| 표준편차 | sd(변수) | 변수의 표준 편차 산출 |
| 분산 | var(변수) | 변수의 분산 산출 |
| 공분산 | cov(변수1, 변수2) | 변수 간 공분산 산출 |
| 상관계수 | cor(변수1, 변수2) | 변수 간 상관계수 산출 |
| 변수의 길이의 합 | length(변수) | 변수의 길이를 값으로 출력 |
2절. 입력과 출력
1. 데이터 불러오기
- R에서 csv, xlsx, txt 등과 같은 다양한 파일 형식의 데이터를 불러올 때 아래의 함수들을 사용한다.
| 기능 | 함수 |
| csv 데이터 파일 읽기 | read.csv(”파일명”, header=FALSE, sep=” 구분자” , .stringsAsFactors=TRUE, …) |
| xlsx 데이터 파일 읽기 | read.xlsx(”파일명”, sheetindex=시트번호, startRow=시작행,header=FALSE, …) *xlsx package 설치 필요 |
| txt 데이터 파일을 테이블 형태로 읽기 | read.txt(”파일명”, header=FALSE, sep=” 구분자” , .stringsAsFactors=TRUE, …) |
| txt 파일을 한줄씩 읽기 | readLines(”파일명”,…) |
💡데이터를 불러오는 함수들의 공통 인자
- header: 첫 행을 변수명으로 지정할지에 대한 여부
- sep: 데이터 셋을 불러올 때 사용할 열 구분자
- stringsAsFactors: 문자형 데이터를 팩터로 인식하여 데이터를 불러올지에 대한 여부
- row.names: 행번호를 지정하여 함께 저장할지에 대한 여부 지정
2. 데이터 저장하기
- 분석을 완료한 데이터를 파일 형식으로 저장하기 위해서는 아래의 함수들을 사용한다.
| 기능 | 함수 |
| csv 데이터 파일 저장 | write.csv(저장할 데이터, file=”파일경로/파일명.csv”, row.names=TRUE,…) |
| xlsx 데이터 파일 저장 | write.xlsx(저장할 데이터, file=”파일경로/파일명.xlsx”, sheetName=”시트명”, row.names=TRUE,…) |
| txt 데이터 파일 저장 | write.table(저장할 데이터, file=”파일경로/파일명.txt”, sep=”구분자”, row.names=TRUE,…) |
💡R에서 다룰수 있는 파일 타입R에서는 Tab-delimited text, Comma-seperated text, Excel file, JSON file, HTML/XML file, Database, (Other) Statistical SW’s file 등을 다룰 수 있음
3절. 데이터 타입과 구조
1. R의 데이터 타입
1. 숫자형(numeric)
- 정수, 실수, 복소수 등의 숫자 데이터는 숫자형 데이터에 해당하며, 수학적 연산 및 통계적 계산이 가능하다.
- 아래의 R 코드와 같이 새로운 변수에 대입 연산자(←)를 이용해 숫자 데이터를 저장할 수 있다.
2. 문자형(character)
- 문자 혹은 단어 등으로 구성된 문자들의 집합은 문자형 데이터에 해당한다.
- R에서 문자는 “” 또는 ‘’내에 표현되며, 문자형 데이터 간의 사칙연산은 불가능하다.
- 숫자를 “” 또는 ‘’내에 표현하여 변수에 저장할 경우, 문자형으로 저장된다.
3. 논리형(logical)
- 논리형 데이터 값은 TRUE와 FALSE이며, TRUE(T와 동일)는 참, FALSE(F와 동일)는 거짓을 의미한다.
- R에서 TRUE는 1로 인식되고, FALSE는 0으로 인식되어 그 자체로 산술 연산이 가능하며, 수치형 데이터로 변환도 가능하다.
4. 팩터형(factor)
- 범주형 자료를 표현하기 위한 데이터 타입이며, factor 함수를 이용하여 생성한다.
- 예를 들어 의류의 사이즈(대,중,소) 등과 같은 세가지 카테고리(범주)를 가지는 변수를 생성한다.
- 대, 중, 소와 같이 범주형 변수 즉, 팩터가 저장할 수 있는 값의 목록을 레벨(level, 수준)이라고 한다.
→ 함수 사용법: factor(data, levels, labels, ordered)
| 인자 | 설명 |
| data | 범주형으로 표현하고자 하는 데이터 |
| levels | 구분하고자 하는 범주(레벨) 목록을 지정 |
| labels | 범주형 표시 값 지정 |
| ordered | TRUE이면 순서형, FALSE이면 명목형 |
5. NA/NULL/NAN/INF
- NA는 Not Available의 약자로 데이터 값이 없음을 의미하는 결측치에 해당한다.
- NULL은 변수의 값이 초기화 되지 않았을 때 사용하며, 정의 되지 않은 값을 나타낸다.
- NAN은 Not Available Number의 약자로 수학적으로 계산이 불가능한 값을 의미한다.
- INF는 Infinite의 약자로 무한대를 의미한다.
- NA는 상수, NULL은 객체에 해당한다.
6. 데이터 타입 변경
| 함수 | 의미 |
| as.numeric(객체명) | 객체를 숫자형으로 변환 |
| as.integer(객체명) | 객체를 숫자형(정수)로 변환 |
| as.double(객체명) | 객체를 숫자형(실수)로 변환 |
| as.character(객체명) | 객체를 문자형으로 변환 |
| as.factor(객체명) | 객체를 팩터로 변환 |
2. R의 데이터 구조
1. 벡터(Vector)
- 벡터는 R프로그래밍의 기본적인 데이터 단위로 다른 프로그래밍 언어의 1차원 배열과도 같은 개념이다.
- 하나의 벡터는 같은 데이터타입(즉, 같은 mode)을 가진 원소들만 저장할 수 있다.
- 예를 들어 문자열만 저장하는 배열 혹은 숫자들만 저장하는 배열이 백터라고 할 수 있다.
→ 벡터의 모든 원소는 같은 데이터 타입을 가지기 때문에 문자형과 숫자형을 혼합하여 입력하더라도 모두 문자형이 된다.
- 인덱싱
- 벡터에 저장된 값의 위치를 인덱스로 사용하여 각 원소에 접근할 수 있으며, [](대괄호)를 이용한다.
| 문법 | 설명 |
| v[n] | v벡터의 n번째 값 반환 |
| v[-n] | v벡터의 n번째 값을 제외한 나머지 원소들을 반환 |
| v[start:end] | v벡터의 start번호부터 end번호에 해당하는 원소들을 반환 |
💡불리언 인덱싱(Boolean Indexing)v[조건문]은 대괄호 안의 조건문을 만족하는 벡터의 원소만을 반환한다.
- 연산
- 벡터는 저장된 각각의 값에 대한 연산, 벡터 전체에 대한 연산, 벡터끼리의 연산을 모두 수행할 수 있다.
- 벡터끼리 연산을 수행하면 원소끼리 연산이 수행된다.
- <길이가 다른 벡터의 연산>
- 길이가 같지 않더라도 아래와 같은 형태로 계산이 된다.
- <길이가 같은 벡터의 연산>
💡recycling rule길이가 다를 경우 자동으로 재활용해 반복하는 것을 말한다. 예를 들면 x가 (2,4,6,8)이고 y가 (1,3)일때 y의 원소를 재활용해 (1,3,1,3)과 같은 형태로 반복하여 계산한다.
2. 행렬(Matrix)
- 행렬은 2차원의 벡터로 행(로우)과 열(컬럼)의 수가 지정된 구조의 데이터 타입이다.
- 벡터와 마찬가지로 하나의 행렬은 한 가지 유형의 스칼라 데이터만 저장할 수 있다.
→ 함수 사용법: matrix(data, nrow, ncol, byrow, dimnames)
| 인자 | 설명 |
| data | 행렬에 저장할 데이터(벡터) 지정 |
| nrow | 행의 수 지정 |
| ncol | 열의 수 지정 |
| byrow | 행렬의 데이터 입력 순서(TRUE: 행 우선, FALSE: 열 우선) |
| dimnames | 행렬의 각 차원에 부여할 이름 지정 |
1. 주요 기능
| 기능 | 함수 | R CODE 예시 |
| 행렬 차원 확인 및 부여 | dim(x) | |
| 행력 차원 확인 및 부여 | dim(x) ← | dim(x) ← c(3,2) #x행렬에 3*2 차원 부여 |
| 행의 수 확인 | nrow(x) | |
| 열의 수 확인 | ncol(x) | |
| 행렬의 원소 추출 | x[nrow, ncol] | x[3,3] #x행렬의 3행 3열의 원소 추출 |
| 행 이름 출력 및 부여 | rownames(x) | |
| 행 이름 출력 및 부여 | rownames(x)← | rownames(x)←c(”r1”,”r2”,”r3”) |
| 열 이름 출력 및 부여 | colnames(x) | |
| 열 이름 출력 및 부여 | colnames(x)← | colnames(x)←c(”a”,”b”,”c”) |
2. 주요 연산 행렬끼리 사칙 연산도 가능하며, R에서는 아래의 표와 같은 연산자 및 함수를 통해 행렬만이 할 수 있는 다양한 연산도 가능하다.
| 기능 | 연산자 및 함수 | 설명 |
| 행렬의 연산 +,- | f+f, f-f, f+1,f-1 | 행렬 간의 덧셈, 뺄셈, 행렬 상수 간 덧셈, 뺄셈 |
| 행렬의 연산 * | f%*%f, f*3 | 행렬 간의 곱, 행렬과 상수 간의 곱 |
| 전치행렬 | f(x) | x의 전치행렬 반환 |
| 대각행렬 | diag(x) | 행렬 x의 대각원소 반환 |
| 역행렬 | solve(x) | x의 역행렬 반환 |
💡%%와 *의 차이점*는 각 행렬의 원소끼리의 곱을 나타낸다.
%*%는 행렬의 곱 연산을 나타낸다.
3. 데이터프레임(DataFrame)
- 데이터프레임은 벡터들의 모임이며, 데이터프레임에 속한 벡터들은 서로 다른 데이터 타입을 가질 수 있다.
| 이름 | 전공 | 성별 | 나이 |
| 이유리 | 경영학과 | 여 | 20 |
| 최민준 | 컴퓨터공학과 | 남 | 22 |
| 김민지 | 데이터과학과 | 여 | 21 |
- 위 표와 같은 데이터프레임은 이름이 저장된 벡터, 전공이 저장된 벡터, 성별이 저장된 벡터, 나이가 저장된 벡터의 모임이라고 볼 수 있다.
- 벡터는 데이터프레임의 열을 이루며, 열은 변수, 행은 객체에 해당한다.
💡데이터프레임행렬은 모든 원소가 동일한 데이터 타입을 가져야 하는데 반해 데이터프레임의 각 변수들은 서로 다른 데이터 타입을 가질 수 있다는 장점으로 데이터 분석을 위해 R에서 가장 많이 사용되는 데이터 구조이다.
→ 함수 사용법:data.frame(변수명1=벡터1, 변수명2=벡터2, … 변수명n=벡터n, stringsAsFactors=TRUE)
| 인자 | 설명 |
| 변수명=벡터 | 변수명과 해당 열에 저장할 벡터를 지정 |
| stringsAsFactors | • 주어진 문자열을 팩터로 저장할지의 여부 • 기본값은 FALSE이므로, 인자값을 지정하지 않으면 문자열은 문자형으로 저장됨 • stringAsFactors의 인자값을 TRUE로 지정하면 문자열을 팩터형으로 저장함 |
💡유용한 함수
- na.omit(데이터프레임): NA가 있는 행을 삭제
- tail(데이터프레임명, n=반환할 행의 개수): 데이터프레임의 하위 행을 반환
- view(데이터프레임, title=제목): 데이터 뷰어를 호출
- example(함수명): 특정 함수의 사용 예제를 바로 실행
- 주요 기능
| 기능 | 함수 | R CODE 예시 |
| 원소 추출: []이용 | data.frame[nrow, ncol] #nrow: 행번호 #ncol: 열번호 |
x[3,6] #x의 3행 6열의 원소 출력 x[-3,] #x의 3행을 제외한 데이터 출력 x[,6] #x의 6열의 모든 행 출력 |
| 원소 추출: $이용 | data.frame$변수명 | iris$Species #iris데이터의 Species열 출력 |
| 데이터 조회: []이용 | data.frame[조건] | x[x$var1>4$x$var2==5] #x데이터프레임에서 var1이 4보다 크고, var2가 5인 조건을 만족하는 레코드 출 |
| 데이터 조회: subset() 이용 | subset(데이터명, 조건) | subset(x, var1>4 & var2==5) #x데이터프레임에서 var1이 4보다 크고, var2가 5인 조건을 만족하는 레코드 추출 |
| 데이터 조회: subset() 이용 | subset(데이터명, 조건, select = 열이름) | subset(x,var1>4,select=c(var2,var3)) #x데이터프레임에서 var1이 4보다 큰 레코드의 var2,var3 데이터셋 조회 #유의사항: 변수명에 “”를 표시하지 않음 #select 인자 사용시 변수명 앞에 -를 붙이면 해당 변수는 제외하고 출력됨 |
| 데이터프레임의 구조 확인 | str(데이터프레임) | #데이터프레임의 행 개수, 열 개수, 변수 이름, 변수의 데이터 타입 등을 확인 가능 |
| 데이터프레임의 상위 행을 반환 | head(데이터프레임 명,n=반환할 행의 갯수) | head(x, n=10) #x데이터의 상위 10개의 행 반환 #n인자의 기본값은 6 |
> ### ====================================
> ### 1. 예시 데이터 만들기
> ### ====================================
> df<- data.frame(
+ 이름=c("철수","영희","민수","지영","수빈"),
+ 나이=c(23,25,21,24,22),
+ 키=c(175,160,180,158,165),
+ 점수=c(85,90,78,92,88)
+ )
>
> df# 데이터 전체 보기
이름 나이 키 점수
1 철수 23 175 85
2 영희 25 160 90
3 민수 21 180 78
4 지영 24 158 92
5 수빈 22 165 88
>
>
> ### ====================================
> ### 2. 원소 추출
> ### ====================================
> # 1) 2행 3열의 값 보기
> df[2,3]
[1] 160
> # 2) 2행 제외하고 보기
> df[-2,]
이름 나이 키 점수
1 철수 23 175 85
3 민수 21 180 78
4 지영 24 158 92
5 수빈 22 165 88
> # 3) 3번째 열(‘키’) 전체 보기
> df[,3]
[1] 175 160 180 158 165
> ### ====================================
> ### 3. $기호로 열 추출
> ### ====================================
> df$이름
[1] "철수" "영희" "민수" "지영" "수빈"
> df$이름 # 이름 열만 보기
[1] "철수" "영희" "민수" "지영" "수빈"
> df$점수 # 점수 열만 보기
[1] 85 90 78 92 88
>
> ### ====================================
> ### 4. 조건으로 행 조회
> ### ====================================
> # 나이가 23보다 큰 사람 보기
> df[df$나이>23,]
이름 나이 키 점수
2 영희 25 160 90
4 지영 24 158 92
>
> # 점수가 85점 이상인 사람 보기
> df[df$점수 >= 85, ]
이름 나이 키 점수
1 철수 23 175 85
2 영희 25 160 90
4 지영 24 158 92
5 수빈 22 165 88
>
>
> ### ====================================
> ### 5. subset() 함수 사용
> ### ====================================
> # 조건으로 행 조회 (나이 > 23)
> subset(df,나이>23)
이름 나이 키 점수
2 영희 25 160 90
4 지영 24 158 92
>
>
> # 조건 + 특정 열만 보기 (나이 > 23이고, 이름과 점수만 보기)
> subset(df, 나이 > 23, select = c(이름, 점수))
이름 점수
2 영희 90
4 지영 92
>
> ### ====================================
> ### 6. 데이터 구조 확인
> ### ====================================
> str(df) # 데이터의 형태, 변수 종류, 데이터 타입 등 확인
'data.frame': 5 obs. of 4 variables:
$ 이름: chr "철수" "영희" "민수" "지영" ...
$ 나이: num 23 25 21 24 22
$ 키 : num 175 160 180 158 165
$ 점수: num 85 90 78 92 88
>
> ### ====================================
> ### 7. 상위 몇 개 행 보기
> ### ====================================
> head(df, n = 3) # 위에서 3행만 보기
이름 나이 키 점수
1 철수 23 175 85
2 영희 25 160 90
3 민수 21 180 78
4. 기타
- 스칼라(Scalar)
- 스칼라는 ‘가’,’나’,’다’와 같은 단일 값을 의미하며, 하나의 숫자, 문자, 논리형 데이터가 저장될 수 있다.
- 배열(Array)
- 행렬이 2차원이라면, 배열은 3차원 또는 n차원까지 확장된 형태의 다차원 데이터이다.
- 리스트(List)
- 리스트는 벡터, 데이터프레임, 배열, 함수 등과 같은 R의 모든 객체를 담을 수 있는 최상위 데이터 구조이다.
- (키, 값) 형태로 데이터를 저장하는 연관 배열(Associative Arrays)로 각 객체에 이름을 지정하여 저장할 수 있으며, 저장할 객체들의 종류가 달라도 무방하다.
5. 데이터 구조 변경
- 자료형과 데이터 구조는 아래와 같은 함수들을 통해 변경할 수 있다.
- as.data.frame()
- as.list()
- as.matrix()
- as.vector()
3. 데이터 핸들링
1. 데이터 결합
| 기능 | 함수 | R CODE 예시 |
| 행 결합 | rbind(객체1, 객체2, …) | rbind(df1,df2) #df1과 df2를 행으로 결합 |
| 열 결합 | cbind(객체1, 객체2, …) | cbind(df1, df2) #df1과 df2를 열로 결합 |
| 데이터 병합 | merge(df1, df2, by=”df1과 df2의 공통 열 이름(병합할 기준이 되는 열)”) | merge(x,y,by=z) #x와 y를 z라는 공통변수를 기준으로 병합 |
💡rbind, cbindrbind와 cbind는 두 객체를 강제로 붙인다. 따라서 rbind는 열의 개수와 열의 이름이 동일해야 하고, cbind 또한 행의 개수가 동일해야 강제로 붙일 수 있다.
> ### ====================================
> ### 1. 예시 데이터 만들기
> ### ====================================
> df1 <- data.frame(
+ 이름 = c("철수", "영희", "민수"),
+ 점수 = c(85, 90, 78)
+ )
>
> df2 <- data.frame(
+ 이름 = c("지영", "수빈"),
+ 점수 = c(92, 88)
+ )
>
> df3 <- data.frame(
+ 이름 = c("철수", "영희", "민수", "지영", "수빈"),
+ 키 = c(175, 160, 180, 158, 165)
+ )
>
> df1
이름 점수
1 철수 85
2 영희 90
3 민수 78
> df2
이름 점수
1 지영 92
2 수빈 88
> df3
이름 키
1 철수 175
2 영희 160
3 민수 180
4 지영 158
5 수빈 165
>
>
> ### ====================================
> ### 2. 행 결합 (rbind)
> ### ====================================
> # df1과 df2를 행으로 결합 (같은 열 이름이어야 함)
> all_rows <- rbind(df1, df2)
> all_rows
이름 점수
1 철수 85
2 영희 90
3 민수 78
4 지영 92
5 수빈 88
>
>
> ### ====================================
> ### 3. 열 결합 (cbind)
> ### ====================================
> # 열 개수가 같을 때 가능 (예: df1과 df3는 행 개수가 다르므로 결합 불가)
> # 예시로, 같은 행 개수를 가진 데이터로 결합해보기
> info1 <- data.frame(이름 = c("철수", "영희", "민수"))
> info2 <- data.frame(키 = c(175, 160, 180))
> info3 <- data.frame(점수 = c(85, 90, 78))
>
> # 열로 결합
> cbind(info1, info2, info3)
이름 키 점수
1 철수 175 85
2 영희 160 90
3 민수 180 78
>
>
> ### ====================================
> ### 4. 데이터 병합 (merge)
> ### ====================================
> # 두 데이터프레임을 공통된 열을 기준으로 병합
> # 이름 열을 기준으로 병합
> merged <- merge(df1, df3, by = "이름")
> merged
이름 점수 키
1 민수 78 180
2 영희 90 160
3 철수 85 175
>
> # 만약 공통 열 이름이 다르다면 by.x, by.y 사용
> a <- data.frame(학생 = c("철수", "영희", "민수"), 점수 = c(85, 90, 78))
> b <- data.frame(이름 = c("철수", "영희", "민수"), 키 = c(175, 160, 180))
>
> merge(a, b, by.x = "학생", by.y = "이름")
학생 점수 키
1 민수 78 180
2 영희 90 160
3 철수 85 175
2. 제어문(반복문, 조건문, 사용자 정의)
- 반복문
- for
- 특정 구문을 반복적으로 수행할 경우 for, while, repeat문을 활용하여 해결할 수 있다.
- 그 중에서도 for문은 주로 반복 횟수가 정해진 경우에 사용하며, 문법과 활용 예시는 아래와 같다.
문법 설명 for(변수 in 데이터){ 반복할 코드 } • ‘데이터’는 여러 값이 지정된 벡터이며, ‘데이터’에 들어있는 값을 변수에 모두 할당할 때까지{}안의 코드를 반복해서 수행
• 데이터 자리에는 수치형 벡터 혹은 수치형 벡터를 저장한 변수를 지정
• for문 안에 또 다른 for문을 중첩하여 사용 가능
- while
- while문은 반복 횟수의 지정 없이 주어진 조건이 참이라면 계속해서 반복을 수행하는 제어문이다.
문법 설명 변수 ← 초기값 while(조건){ 조건이 참일 때 수행할 코드 } • 괄호 안에 조건이 참일때 {}안의 코드가 수행되고, 조건이 거짓일 때 while문이 종료
• while문을 정의하기 전에 먼저 조건에 사용될 변수의 초기값을 지정해야 함
- while문은 반복 횟수의 지정 없이 주어진 조건이 참이라면 계속해서 반복을 수행하는 제어문이다.
- for
2. 조건문
- if/else
- 조건식을 기준으로 조건이 참(TRUE)일 때와 거짓(FALSE)일 때의 처리 방식을 다르게 하려는 경우에는 if/else 조건문을 사용한다.
문법 설명 if(조건1){
조건1이 참일 때 수행할 코드
}else if(조건2){
조건1이 거짓이고 조건2가 참일 때 수행할 코드
} else{ 모든 조건이 거짓일 때 수행할 코드}• 괄호 안의 조건이 참, 거짓일 때 각각 {} 안의 코드를 실행
• 조건이 하나 이상인 경우, else if를 통해 조건을 추가할 수 있으며, 여러번 추가하는 것도 가능
• else if와 else는 필요에 따라 지정하거나 생략이 가능
- 조건식을 기준으로 조건이 참(TRUE)일 때와 거짓(FALSE)일 때의 처리 방식을 다르게 하려는 경우에는 if/else 조건문을 사용한다.
- ifelse
- 처리하고자 할 구문이 단순할 경우에는 if/else 대신 ifelse 함수를 사용할 수 있다.
문법 설명 ifelse(조건,a,b) • 조건이 참이면 a자리의 코드를 실행하고, 거짓이면 b자리의 코드를 실행
• 내부에 또 다른 ifelse 구문을 중첩하여 사용 가능
• 엑셀의 if()함수처럼 1줄 만으로도 조건문 코드를 작성할 수 있다는 강력한 장점이 있다.
- 처리하고자 할 구문이 단순할 경우에는 if/else 대신 ifelse 함수를 사용할 수 있다.
- 사용자 정의
- 사용자가 원하는 기능을 가진 함수를 직접 만들기 위해서는 다음과 같은 R코드를 사용한다.
function(인자1,인자2,인자3,...인자n){ 표현식1 표현식2 ...표현식n return(반환값) }- 함수의 작동에 필요한 인자들을 첫 번째 괄호 안에 명시한 후, 중괄호({})안에 함수에서 수행할 구문을 입력한다.
- return 구문에는 함수의 실행이 완료된 후 최종적으로 반환할 값을 입력한다. 반환할 값이 없는 경우에는 return 구문을 생략할 수 있으며, return값을 명시하지 않으면 {}안의 마지막 구문이 만들어 내는 결과를 반환한다.
- 인자의 갯수가 정해지지 않은 경우와 함수 내부에서 호출하는 다른 함수로 인자를 넘겨줄 경우에는 인자목록에 ‘…’라는 표현을 사용한다.
- 함수 내부에 또 다른 함수를 정의하는 ‘중첩함수’의 정의가 가능하다.
> ### ====================================
> ### 🧮 학생 점수 계산기 함수
> ### ====================================
>
> score_calculator <- function(mid, final, hw) {
+ # 1. 평균 점수 계산
+ avg <- (mid + final + hw) / 3
+
+ # 2. 등급 계산
+ grade <- ""
+ if (avg >= 90) {
+ grade <- "A"
+ } else if (avg >= 80) {
+ grade <- "B"
+ } else if (avg >= 70) {
+ grade <- "C"
+ } else if (avg >= 60) {
+ grade <- "D"
+ } else {
+ grade <- "F"
+ }
+
+ # 3. 결과 반환 (리스트 형태)
+ result <- list(
+ 평균 = round(avg, 2),
+ 등급 = grade
+ )
+
+ return(result)
+ }
>
> ### ====================================
> ### 🧍♂️ 함수 사용 예시
> ### ====================================
>
> # 철수의 점수: 중간 85, 기말 90, 과제 80
> score_calculator(85, 90, 80)
$평균
[1] 85
$등급
[1] "B"
>
> # 영희의 점수: 중간 70, 기말 75, 과제 65
> score_calculator(70, 75, 65)
$평균
[1] 70
$등급
[1] "C"
>
> # 민수의 점수: 중간 95, 기말 98, 과제 100
> score_calculator(95, 98, 100)
$평균
[1] 97.67
$등급
[1] "A"
3. 문자열/날짜형 데이터 핸들링
- 문자열 다루기
| 함수 | 기능 |
| rchar(”문자열”) | 문자열의 길이 반환 |
| paste(”문자열1”,”문자열2”,…,sep=””) | 지정한 문자(열)를 sep에 지정한 구분자로 연결 |
| substr(”문자열”, 시작번호, 끝번호) | 문자열의 시작번호부터 끝번호까지를 추출 |
| strsplit(”문자열”, 구분자) | 구분자를 기준으로 문자열을 분리 |
| sub(”대상문자열”, “변경문자열”, str) | str(문자열)에서 대상문자열을 찾아 변경 문자열로 한번만 대치 |
| gsub(”대상문자열”,”변경문자열”,str) | str(문자열)에 있는 모든 대상문자열을 변경문자열로 대치 |
| grep(”찾을 문자열”,str) | str(문자열)에서 찾을 문자열이 포함된 문자열 혹은 인덱스를 출력 |
### ----------------------------------
### 1. 문자열의 길이 확인
### ----------------------------------
text <- "Hello R!"
nchar(text) # 문자열 길이 (7)
### ----------------------------------
### 2. 문자열 연결
### ----------------------------------
a <- "Hello"
b <- "World"
paste(a, b, sep = " ") # "Hello World"
paste(a, b, sep = "-") # "Hello-World"
### ----------------------------------
### 3. 부분 문자열 추출
### ----------------------------------
sentence <- "Statistics"
substr(sentence, 1, 4) # "Stat"
substr(sentence, 6, 10) # "stics"
### ----------------------------------
### 4. 문자열 분리
### ----------------------------------
fruits <- "apple,banana,grape"
strsplit(fruits, ",") # "apple" "banana" "grape"
### ----------------------------------
### 5. 문자열 치환 (한 번만)
### ----------------------------------
text <- "R is good, R is fast"
sub("R", "Python", text) # 첫 번째 R만 변경
### ----------------------------------
### 6. 문자열 치환 (모두)
### ----------------------------------
gsub("R", "Python", text) # 모든 R 변경
### ----------------------------------
### 7. 문자열 찾기 (grep)
### ----------------------------------
names <- c("철수", "영희", "민수", "지영")
grep("영", names) # "영"이 들어간 인덱스
grep("영", names, value = TRUE) # "영"이 포함된 값 출력
2. 날짜형 다루기
| 함수 | 기능 |
| Sys.Date() | 현재 날짜 반환 |
| as.Date() | 데이터 타입을 날짜 형식으로 변환 |
| format(Sys.Date(), “%m%d%y”) | 현재 날짜를 format에 지정한 형태의 문자열로 변환 |
| format(Sys.Date(),”%a”) | 축약된 형태의 요일 조회 |
| format(Sys.Date(),”%b”) | 축약된 월 이름 조회 |
| format(Sys.Date(),”%B”) | 전체 월 이름 조회 |
| format(Sys.Date(),”%d”) | 두 자리 숫자로 일 조회 |
| format(Sys.Date(),”%m”) | 두 자리 숫자로 월 조회 |
| format(Sys.Date(),”%y”) | 두 자리 숫자로 연도 조회 |
| format(Sys.Date(),”%Y”) | 네 자리 숫자로 연도 조회 |
### ----------------------------------
### 1. 오늘 날짜
### ----------------------------------
Sys.Date()
### ----------------------------------
### 2. 문자 → 날짜형 변환
### ----------------------------------
date_str <- "2025-10-16"
as.Date(date_str) # 날짜형으로 변환
### ----------------------------------
### 3. 날짜 포맷 변경
### ----------------------------------
format(Sys.Date(), "%m%d%y") # 월일년 (예: 101625)
format(Sys.Date(), "%a") # 요일 (예: Thu)
format(Sys.Date(), "%b") # 축약 월명 (예: Oct)
format(Sys.Date(), "%B") # 전체 월명 (예: October)
format(Sys.Date(), "%d") # 일 (예: 16)
format(Sys.Date(), "%m") # 월 (예: 10)
format(Sys.Date(), "%y") # 연도(2자리, 예: 25)
format(Sys.Date(), "%Y") # 연도(4자리, 예: 2025)
'데이터분석-ADSP > 3과목-데이터분석' 카테고리의 다른 글
| 데이터 마트 (0) | 2025.12.09 |
|---|---|
| 데이터 분석 개요 (1) | 2025.11.04 |